2016-12-13 5 views
0

SQL Server 2014にストアドプロシージャがあり、ハードコードされたパラメータで直接クエリを実行すると、瞬時に実行されます。 ストアドプロシージャを実行するときに時間がかかります。クエリ実行が高速、ストアドプロシージャが遅い - 複数の試行が行われました

それは、私は、ストアドプロシージャでこれらのparamsをハードコードしているし、それがほぼ瞬時に実行されるような問題を引き起こしているトップ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') 

を取得して選択クエリでパラメータを表示されます。

私はparameter sniffingについてよく読んで、Query runs fast, but runs slow in stored procedureで示唆しているようにいくつか試みました。私は地元のもの は私も

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 @[email protected], @[email protected],@[email protected] /*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 
+0

'username'列と' orgid'列はNVARCHAR(100)データ型ですか? – Siyual

+0

@Siyual - 実際には、彼らはvarcharではありません(50)。私はそれを確認するとは思わなかった、これは継承されたストアドプロシージャです。私はそれらに合って試してみる。 – Bex

+0

@Siyual That Worked!ありがとうございました!!それを答えに入れると、私はあなたに値する信用を与えることができます! – Bex

答えて

4

SQL Serverには、暗黙のキャストで大部分が良い仕事を行いますが、それは、クエリを行き詰まらできることがございます。値をハードコーディングすると即座に戻りますが、変数を使用しても値は返されません。

変数を使用する場合は、データ型が列のデータ型と一致することを確認してください。問題は、あなたの変数がNVARCHAR (100)であり、列がVARCHAR (50)であると思われます。 (式中の

型変換:、あなたは警告として、次のようなメッセージが表示される場合があり、このような場合には -

これが問題になる可能性がありますかどうかを確認する別の方法は、クエリプランを調べることですCONVERT_IMPLICIT(...))クエリプランの選択で "SeekPlan"に影響する可能性があります

関連する問題