私はSQL Server 2016を持っています。異なる名前を持つ2つのストアドプロシージャは絶対に同じですが、実行方法は異なります。最初は17分で完了し、18秒後に完了する。 最初に、要素の1つの索引が作成されたが、プランが再コンパイルされ、プラン・キャッシュからすべての計画がクリアされる前に作成されました。 結果は変更されません。SQL Serverのストアドプロシージャ実行の違い
どのような問題があり、どのように実行計画を再構成できますか?
私はSQL Server 2016を持っています。異なる名前を持つ2つのストアドプロシージャは絶対に同じですが、実行方法は異なります。最初は17分で完了し、18秒後に完了する。 最初に、要素の1つの索引が作成されたが、プランが再コンパイルされ、プラン・キャッシュからすべての計画がクリアされる前に作成されました。 結果は変更されません。SQL Serverのストアドプロシージャ実行の違い
どのような問題があり、どのように実行計画を再構成できますか?
ストアドプロシージャのパフォーマンスを向上させるには、スクリプトを低く実行する必要があります。実行計画を再作成するのに役立ちます。
EXEC sp_recompile N'ProcedureName';
GO
DBCC FREEPROCCACHE WITH NO_INFOMSGS;
GO
EXEC sp_updatestats;
GO
これはあなたのために機能しましたか、試したことを文書化していますか? –
はい、うまくいきました。初めて2分間実行すると、次の実行時間はすべて約18秒でした。 –
ARITHABORT、XACT_ABORTなどのストアドプロシージャの設定を確認します。これらはすべて実行計画に影響します。 procを作成するとき、その時点で有効な設定はprocのメタデータに「固執」し、計画に影響を与えます。 – Brandon
sp_recompileを使用しましたか?このようなテストを行う際に考慮する必要があることは、両方のストアドプロシージャにWITH RECOMPILEを配置して、オプティマイザがコマンドごとに新しいクエリプランをフェッチするようにすることです。また、テストの前に統計情報を更新することもできます。パラメータが同じでクエリが同じ場合は、上記のように17分の違いはありません。他に、もしあなたのspが多くのパラメータを持っているか、あなたのステートメントの中で非伝統的な方法で使われているなら、パラメータスニッフィングの問題を防ぐためにOPTIMIZE FOR UNKNOWN(テスト中< - )を使いたいかもしれません。 –
再コンパイルのステートメント: "EXEC sp_recompile N'ProcedureName '; GO DBCC FREEPROCCACHE WITH NO_INFOMSGS;" –