2

私はSQL Serverを使用しており、クエリプランの再利用のメリットを得たいと考えています。このdocumentが見つかりましたが、クエリの計画が再利用されているかどうかは不明です。異なる値は、@suに挿入されているようにSQL Server 2012でのクエリプランの再利用

declare @su dbo.IntCollection  -- TABLE (Value int not null) 

insert into @su values (1),(2),(3) --... about 500 values 

update mt 
set mt.MyField = getutcdate() 
from MyTable mt 
join @su vsu on mt.Id = vsu.Value -- Clustered PK, int 

技術バッチのテキストは、実行するための実行とは異なります。しかし、更新クエリのテキストは同じままです。 .NETを使用していた場合は、基本的にSQL変数にテーブル変数を渡しますが、Pythonを使用していますので、プログラムからテーブルパラメータを渡す方法がないようです。

質問1:更新クエリの計画は再利用されますか?または、オプティマイザはバッチのテキストが異なっていると見て、バッチで単一のクエリを分析しませんか? Iは、テーブルパラメータでストアドプロシージャを導入することによって、呼び出しの間同じままにSQLを強制することができ、私はそれから利益を得るだろう:すなわち、

update MyTable 
set MyField = getutcdate() 
where Id in (1, 2, 3 ...) 

質問2と同じですか

質問3:プランが再利用されたか、再度計算されたかどうかを特定のクエリで識別する方法はありますか?

質問4:私は特定のケースで上記すべてについて心配する必要がありますか?更新クエリのプランが再利用を取得ん:すべての後に...

答えて

2

はちょうどあなたの質問に答える...

質問1のIDの束上の表のちょうど更新のですか?または、オプティマイザはバッチのテキストが異なっていると見て、バッチで単一のクエリを分析しませんか? SQLは、古いハッシュと一致しなくなり、クエリと任意の簡単な変更のハッシュを計算しようとするので、言い換えれば、それは、新しいクエリとして扱われ

あなたの両方の更新文

と同じである

質問2:テーブルパラメータを持つストアドプロシージャを導入することで、呼び出し間でSQLを同じにしておくことができますが、その利点はありますか?

これはIN's

質問3の束よりもme..ratherする良い方法のように聞こえる:その計画は再利用や再計算されたかどうかを指定したクエリに対して識別するために、どのように?

select usecounts from sys.dm_exec_cached_plans ec 
cross apply 
sys.dm_exec_sql_text(ec.plan_handle) txt 
where txt.text like '%your query text%' 

質問4:私は私の特定の場合には上記に関するすべての心配すべきか?結局のところ、IDの束の上のテーブルの更新です...

私には、あなたは心配しています...ホワイトペーパーで指摘されているようにクエリプランの再利用行動を強制する多くのルールがありますあなたは参照しました。ほとんどの場合、クエリプランは再利用されます。https://dba.stackexchange.com/questions/19544/how-badly-do-sql-compilations-impact-the-performance-of-sql-server

SQLコンピレーション/秒が良いメトリックですが、接続されたときにのみ:

私は私が高いSQL Compilations/secここで回答から撮影Batch Requests/sec

と相まって見たときにのみ使いやす再計画の心配を開始しますバッチリクエスト/秒。それ自体では、1秒あたりのコンパイルでは実際に多くのことが分かりません。

170が表示されています。バッチreq /秒が200(効果が少し誇張されています)であれば、原因の最下部まで下がる必要があります(おそらく、計画を使用する)。しかし、1秒あたりのバッチ要求が約5000であれば、1秒あたり170回のコンパイルはまったく悪くありません。 Compilations/secは合計バッチ要求数/秒の10%以下である必要があります。

+0

はい、ちょうどチェックして、プランが再利用されていないことが判明しました。テスト目的のためにストアドプロシージャを書きましたが、今は 'update'の計画が再利用されていますが、 'declare @ v'や' insert into @ v'(そしてこのバッチの計画は基本的ですが再利用されません)のようなパラメータ変数です。 あなたはどう思いますか、一般的にはより良いアプローチですか? – greatvovan

+0

私は上記のコメントに基づいて100%確信していません。計画が再利用されていないときは、チェックするべきことがたくさんあります。例を使ってバッチを詳しく説明できます – TheGameiswar

+0

私はfolowingを意味します: SP: 'create procedure my_proc @su IntCollection as update ...'で、 'update'の計画が再利用されているのを見ています。私のプログラムからmy_procを呼び出すには、次のようなバッチを実行する必要があります: 'declare @su IntCollection'' @su values(1)、(2)、(3) '' exec my_proc @ su'ともちろん、このバッチの計画は、実行ごとに異なる挿入値があるため、再利用されません。この場合、SPを使用する方が良いですか? – greatvovan