簡體   English   中英

查詢運行速度快,存儲過程慢-嘗試了多種操作

[英]Query Runs Fast, Stored Procedure Slow - Multiple things tried

我在SQL Server 2014上有一個存儲過程,當使用硬編碼的參數直接運行查詢時,它會立即運行。 當它通過存儲過程運行時,將花費很長時間或超時。

在選擇查詢中顯示參數,該參數排在前1位

  , ISNULL((SELECT TOP 1 block_score FROM block_states BS WHERE BS.block_id = defined_blocks.id AND BS.user_name = @local_userName AND BS.orgId = @local_orgId AND BS.assessment_key = 0 ), 'NONE' )

這是導致問題的原因,因為我已經在存儲過程中對這些參數進行了硬編碼,並且它幾乎立即運行。

我已經閱讀了很多有關參數嗅探的知識,並且正如Query中所建議的那樣, 運行速度很快,但是在存儲過程中運行速度卻很慢,並且嘗試了一些方法。 我已經將參數設為本地參數,也嘗試添加

OPTION(RECOMPILE)

並嘗試運行

exec sp_updatestats 

但似乎一切都沒有或幾乎沒有什么不同。

存儲過程如下:

     @userName NVARCHAR(100), @orgId NVARCHAR(100),@ chartId INT
AS



    DECLARE @definedchartBlocks TABLE(
        chartId INT,
        sectId BIGINT,
        subsectId BIGINT,
        blockId BIGINT,
        blockScore NVARCHAR(10)

    )
        Declare  @local_userName NVARCHAR(100), @local_orgId NVARCHAR(100), @local_chartId INT
        select @local_userName=@userName, @local_orgId=@orgId,@local_chartId=@chartId /*attempt to speed up stp*/


    INSERT INTO @definedchartBlocks

    SELECT      
        defined_sects.chart_id
        , defined_subsects.sect_id
        , defined_blocks.subsect_id
        , defined_blocks.id AS blockId

        , ISNULL((SELECT TOP 1 block_score FROM block_states BS WHERE BS.block_id = defined_blocks.id AND BS.user_name = @local_userName AND BS.orgId = @local_orgId AND BS.assessment_key = 0 ), 'NONE' )
    FROM         
        defined_subsects 
        INNER JOIN
        defined_sects ON defined_subsects.sect_id = defined_sects.id 
        INNER JOIN
        defined_blocks ON defined_subsects.id = defined_blocks.subsect_id
    WHERE     
        (defined_sects.chart_id = @local_chartId)

OPTION(RECOMPILE)

    IF EXISTS (
    SELECT      
            MAX(definedchartBlocks.blockScore)
    FROM         
        @definedchartBlocks definedchartBlocks
    WHERE
        definedchartBlocks.blockScore = 'AMBER' OR definedchartBlocks.blockScore = 'RED' OR definedchartBlocks.blockScore = 'NONE' OR definedchartBlocks.blockScore = '' OR definedchartBlocks.blockScore IS NULL

    GROUP BY 
        definedchartBlocks.blockScore
    )
    BEGIN

        SELECT 0 AS chartCompleted
    END
    ELSE
    BEGIN
        SELECT 1 AS chartCompleted
    END

SQL Server在大多數情況下都使用隱式強制轉換做得很好,但是有時它可能會使查詢陷入癱瘓。 您提到對值進行硬編碼會立即返回,但使用變量卻不會。

使用變量時,請確保數據類型與列的數據類型匹配。 我懷疑問題是您的變量是NVARCHAR (100)而列是VARCHAR (50)

查看這是否可能是問題的另一種方法是查看查詢計划-在這種情況下,您可能會看到類似以下內容的警告:

表達式中的類型轉換(CONVERT_IMPLICIT(...))可能會影響查詢計划選擇中的“ SeekPlan”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM