存储过程优化

qingYun1029 2013-12-23 06:06:14
下列是通过“dmv”找出来的一条“查询显示缓存计划所占用的 CPU 总使用率”的存储过程,参考http://technet.microsoft.com/zh-cn/library/bb838723.aspx
现在想对其进行优化,但是看来看去感觉除了感觉可以讲其中三处 “@Count > @Total”(调整写法后)定义出一个标量之外,感觉没有其他可以优化的,望大神赐教,谢谢!



SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[c_DueConscriptionQueue]
@ID INT
AS
IF NOT EXISTS ( SELECT [ID]
FROM [Conscription_Queue]
WHERE [ID] = @ID
AND [Completed] = 0 )
BEGIN
RETURN 0
END

DECLARE @TroopID INT
DECLARE @VillageID INT
DECLARE @UnitTraining INT
DECLARE @NextUnit DATETIME
DECLARE @Total INT

DECLARE @Count INT

SELECT @VillageID = [VillageID], @TroopID = [TroopID], @NextUnit = [NextUnit], @UnitTraining = [UnitTraining], @Total = [Total]
FROM [Conscription_Queue]
WHERE [ID] = @ID

IF ( @UnitTraining <> 0 )
BEGIN
SET @Count = DATEDIFF(s, @NextUnit, GETDATE()) / @UnitTraining + 1
END
ELSE
BEGIN
RETURN 0
END

--检查是否已存在兵种,不存在新增,存在 增加数量
IF NOT EXISTS ( SELECT *
FROM [Village_Troops]
WHERE [VillageID] = @VillageID
AND [InVillageID] = @VillageID
AND [TroopID] = @TroopID
AND [GarrisonType] = 1 )
BEGIN
IF ( @Count > @Total )
BEGIN
SET @Count = @Total
END
INSERT INTO [Village_Troops] ( [TroopID], [quantity], [VillageID], [InVillageID], [GarrisonType] )
VALUES ( @TroopID, @Count, @VillageID, @VillageID, 1 )
END
ELSE
BEGIN
IF ( @Count > @Total )
BEGIN
SET @Count = @Total
END
UPDATE [Village_Troops]
SET [quantity] = [quantity] + @Count
WHERE [VillageID] = @VillageID
AND [TroopID] = @TroopID
AND [InVillageID] = @VillageID
AND [GarrisonType] = 1
END

--增加耗粮
DECLARE @Upkeep INT
SELECT @Upkeep = [Upkeep]
FROM Troops
WHERE ID = @TroopID

UPDATE [Villages]
SET [TroopsUpkeep] = [TroopsUpkeep] + @Upkeep * @Count
WHERE [TileID] = @VillageID

IF ( @Count >= @Total ) --检查是否造完
BEGIN
UPDATE [Conscription_Queue]
SET [Total] = 0, [Completed] = 1
WHERE [ID] = @ID
END
ELSE
BEGIN
UPDATE [Conscription_Queue]
SET [NextUnit] = DATEADD(ss, @UnitTraining * @Count, @NextUnit), [Total] = [Total] - @Count
WHERE [ID] = @ID
AND [Total] > 0
END
...全文
674 189 打赏 收藏 转发到动态 举报
写回复
用AI写文章
189 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2013-12-24
  • 打赏
  • 举报
回复
所以说我很难跟你说清楚
qingYun1029 2013-12-24
  • 打赏
  • 举报
回复
引用 70 楼 DBA_Huangzj 的回复:
也不一定,应该理解为根据“要用到的列”来判断,这里是因为聚集索引的体积比较大,所以如果能换成非聚集索引,也不失为一个坏处
好高深的样子。
發糞塗牆 2013-12-24
  • 打赏
  • 举报
回复
也不一定,应该理解为根据“要用到的列”来判断,这里是因为聚集索引的体积比较大,所以如果能换成非聚集索引,也不失为一个坏处
qingYun1029 2013-12-24
  • 打赏
  • 举报
回复
引用 68 楼 DBA_Huangzj 的回复:
[quote=引用 67 楼 qingYun1029 的回复:] [quote=引用 63 楼 DBA_Huangzj 的回复:] 点了实际,你要实际EXEC 存储过程才有
帮我看一下呗,指点一下,这个是实际的。你先讲个思路。 [/quote]就你这个执行计划来说,可能只有通过对ID和Completed列做组合非聚集索引来提高性能能。其他貌似没啥好提升[/quote] 根据where条件来判断?
發糞塗牆 2013-12-24
  • 打赏
  • 举报
回复
引用 67 楼 qingYun1029 的回复:
[quote=引用 63 楼 DBA_Huangzj 的回复:] 点了实际,你要实际EXEC 存储过程才有
帮我看一下呗,指点一下,这个是实际的。你先讲个思路。 [/quote]就你这个执行计划来说,可能只有通过对ID和Completed列做组合非聚集索引来提高性能能。其他貌似没啥好提升
qingYun1029 2013-12-24
  • 打赏
  • 举报
回复
引用 63 楼 DBA_Huangzj 的回复:
点了实际,你要实际EXEC 存储过程才有


帮我看一下呗,指点一下,这个是实际的。你先讲个思路。

發糞塗牆 2013-12-24
  • 打赏
  • 举报
回复
这个慢慢来吧,急不了
qingYun1029 2013-12-24
  • 打赏
  • 举报
回复
引用 63 楼 DBA_Huangzj 的回复:
点了实际,你要实际EXEC 存储过程才有
哦哦。谢谢啦!
qingYun1029 2013-12-24
  • 打赏
  • 举报
回复
引用 61 楼 DBA_Huangzj 的回复:
看开销,这个说起来是一本书的内容。实在说不清楚,你到博客园找找也行


好恐怖:
發糞塗牆 2013-12-24
  • 打赏
  • 举报
回复
点了实际,你要实际EXEC 存储过程才有
qingYun1029 2013-12-24
  • 打赏
  • 举报
回复
引用 59 楼 DBA_Huangzj 的回复:
左边的是预估执行计划,右边的是实际执行计划
点击”预估...“还有张图片(执行计划),可是点击”实际...“什么都没有呀?
發糞塗牆 2013-12-24
  • 打赏
  • 举报
回复
看开销,这个说起来是一本书的内容。实在说不清楚,你到博客园找找也行
qingYun1029 2013-12-24
  • 打赏
  • 举报
回复
引用 59 楼 DBA_Huangzj 的回复:
左边的是预估执行计划,右边的是实际执行计划
这个我知道,分别就是ctrl+L 和ctrl+M 嘛。 可是看什么呢?
發糞塗牆 2013-12-24
  • 打赏
  • 举报
回复
左边的是预估执行计划,右边的是实际执行计划
qingYun1029 2013-12-24
  • 打赏
  • 举报
回复
引用 57 楼 DBA_Huangzj 的回复:
等你会看执行计划再算吧,现在你的水平跟你说太多也没用,而且优化这东西,10本书都说不完
看执行计划? 怎么看?就是那个ctrl+L么?
發糞塗牆 2013-12-24
  • 打赏
  • 举报
回复
等你会看执行计划再算吧,现在你的水平跟你说太多也没用,而且优化这东西,10本书都说不完
qingYun1029 2013-12-24
  • 打赏
  • 举报
回复
引用 54 楼 DBA_Huangzj 的回复:
[quote=引用 52 楼 qingYun1029 的回复:] 这么牛逼?? 可是我忘记了操作,你能讲讲大概的意思么? 大概的操作就是 exec proc_XXX ,然后ctrl+l,执行绿色的部分(建立存储过程),好像其他就没有了呀。。
实际上可能就是一个索引导致了查询缓慢,这是其中一种优化方法
引用 53 楼 qingYun1029 的回复:
[quote=引用 51 楼 DBA_Huangzj 的回复:] SET STATISTICS IO ON --关闭有关由Transact-SQL 语句生成的磁盘活动量的信息 这个,你没关掉
没关这个应该没什么影响吧,只是每次执行sql语句都会显示磁盘操作相关的信息?[/quote]是没关系,这个是会话级别的,关了窗口就没了,[/quote] 还有其他办法没有呢?
qingYun1029 2013-12-24
  • 打赏
  • 举报
回复
“实际上可能就是一个索引导致了查询缓慢,这是其中一种优化方法” 嗯嗯 那行绿色的提示应该是工具自动分析出来的吧?
發糞塗牆 2013-12-24
  • 打赏
  • 举报
回复
引用 52 楼 qingYun1029 的回复:
这么牛逼?? 可是我忘记了操作,你能讲讲大概的意思么? 大概的操作就是 exec proc_XXX ,然后ctrl+l,执行绿色的部分(建立存储过程),好像其他就没有了呀。。
实际上可能就是一个索引导致了查询缓慢,这是其中一种优化方法
引用 53 楼 qingYun1029 的回复:
[quote=引用 51 楼 DBA_Huangzj 的回复:] SET STATISTICS IO ON --关闭有关由Transact-SQL 语句生成的磁盘活动量的信息 这个,你没关掉
没关这个应该没什么影响吧,只是每次执行sql语句都会显示磁盘操作相关的信息?[/quote]是没关系,这个是会话级别的,关了窗口就没了,
qingYun1029 2013-12-24
  • 打赏
  • 举报
回复
引用 51 楼 DBA_Huangzj 的回复:
SET STATISTICS IO ON --关闭有关由Transact-SQL 语句生成的磁盘活动量的信息 这个,你没关掉
没关这个应该没什么影响吧,只是每次执行sql语句都会显示磁盘操作相关的信息?
加载更多回复(169)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧