私は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:私は特定のケースで上記すべてについて心配する必要がありますか?更新クエリのプランが再利用を取得ん:すべての後に...
はい、ちょうどチェックして、プランが再利用されていないことが判明しました。テスト目的のためにストアドプロシージャを書きましたが、今は 'update'の計画が再利用されていますが、 'declare @ v'や' insert into @ v'(そしてこのバッチの計画は基本的ですが再利用されません)のようなパラメータ変数です。 あなたはどう思いますか、一般的にはより良いアプローチですか? – greatvovan
私は上記のコメントに基づいて100%確信していません。計画が再利用されていないときは、チェックするべきことがたくさんあります。例を使ってバッチを詳しく説明できます – TheGameiswar
私は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