2015-12-16 14 views
5

ストアドプロシージャに配置するクエリがあります。ローカル変数を使ってクエリを実行すると、クエリの実行に1秒かかります。ストアドプロシージャ内に同じクエリを配置してSPを呼び出すと、実行に約2分かかります。ストアドプロシージャ内に配置するとSQL Serverクエリが遅く実行される

これまでの質問から、私はパラメータスニッフィングに関連している可能性があると思います。私がSPの中にローカル変数を宣言してから、ローカル変数を使用する前にこの問題が発生したとき。これは過去に働いていましたが、この場合は私を助けてくれないようです。

私は現在、私もまた、私はそうのような私のSPの最後にOPTION(RECOMPILE)を追加しようとしているので、

CREATE PROCEDURE dbo.ProcedureName 

    @DIV VARCHAR(4), 
    @STD VARCHAR(1), -- S or N 
    @scen varchar(20) 

WITH RECOMPILE 
AS 
BEGIN 

    DECLARE 
     @DIV_copy VARCHAR(4), 
     @STD_copy VARCHAR(1), 
     @scen_copy varchar(20); 
    SELECT 
     @DIV_copy = @DIV, 
     @STD_copy = @STD, 
     @scen_copy = @scen; 

ようWITH RECOMPILEを追加しようとしている

CREATE PROCEDURE dbo.ProcedureName 

    @DIV VARCHAR(4), 
    @STD VARCHAR(1), -- S or N 
    @scen varchar(20) 
AS 
BEGIN 

    DECLARE 
     @DIV_copy VARCHAR(4), 
     @STD_copy VARCHAR(1), 
     @scen_copy varchar(20); 
    SELECT 
     @DIV_copy = @DIV, 
     @STD_copy = @STD, 
     @scen_copy = @scen; 

あります

SELECT * 
    FROM #Output 

OPTION(RECOMPILE) 

END 
GO 

私も使ってみました:

OPTION(OPTIMIZE FOR UNKNOWN) 

と同様に:このオプションをオン

OPTION(QUERYTRACEON 4136) 

、私は、クエリのトレースのための適切な権限を持っていません。

上記の5つの修正プログラムのいずれも、ストアドプロシージャがストアドプロシージャの外部に1〜2秒かかる同じクエリの場合、2分から2分30秒の間に問題が発生するため、この問題は解決されません。

これらの修正プログラムはすべて、誰もが同じような問題があった

Different Approaches to Correct SQL Server Parameter Sniffing」は、この記事から来ましたの?あなたの時間をありがとう!

のSQL Server 2008R2

+0

これはパラメータスニッフィングのように聞こえますが、それが何であるか他の考え方はありません。この記事では、まだ試していない追加のソリューションがあるかどうかを確認することができます:http://www.sommarskog.se/query-plan-mysteries.html –

+0

'OPTION(RECOMPILE)を私のSPの終わり - それは不快なクエリの後に配置する必要があります。しかし、 '再コンパイルで'が動作しなかった場合、私はこの訂正が疑わしいです。 –

+0

私は全く同じ症状を抱えており、paramsのローカルコピーを作成すると常に解決されています。唯一の違いは、SELECTステートメントの代わりにSETステートメントを使用してローカル変数に値をコピーしていることです。 –

答えて

0

単独のSQL文と比較すると、ストアド・プロシージャ内に配置されたときとまったく同じクエリがそんなにトラブルを持っていた理由は残念ながら、私は把握していませんでした。

「回避策」として、私はSP内でクエリを最適化するのに少し時間を費やしました。私が参加していた1つのテーブルが非常に大きかった(何百万と何百万もの行)ので、私がしたのは大きなテーブルから関連するデータを取得し、それを保持する一時テーブルを作成し、そのトリックをするように見えた。 SPは3〜4秒後に実行されます。

私はまだ基​​本の外でSQLに若干新しくなっていますので、私は多くを学んでいます。これがクエリを精査するためのリマインダとして役立つようにしましょう。改善の余地があることがよくあります。これはスコッチテープやクリップのような感じですが、私の問題は解決しました。

ありがとうございます。

+0

テンポラリテーブルではなく、ジョイン条件に一致するインデックスを大きなテーブルに追加すると、よりうまくいくでしょう。 –

+0

本当ですが、私はDBAチームにおそらく尋ねることができますが、その権限を持っていません。 – Soulfire

関連する問題