当前位置: 代码迷 >> Sql Server >> 存储过程优化解决方法
  详细解决方案

存储过程优化解决方法

热度:61   发布时间:2016-04-24 18:33:33.0
存储过程优化
下列是通过“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
  相关解决方案