0

誰かがこれが機能する理由を説明してください。こちらがシチュエーションです。ストアド プロシージャがあり、動作が遅くなり始めます。次に、パラメーターを選択し、その値を格納する変数を宣言し、proc でパラメーターの代わりに宣言された変数を使用します。その後、proc は大幅に高速化されます。

キャッシュされた計画と統計に関係があると思いますが、よくわかりません。データの現在の状態とは異なるデータの過去の状態に基づいてキャッシュされた計画が最適化されるように、データベースが拡大および変更されるにつれて統計が古くなるのでしょうか?

ありがとう。

4

2 に答える 2

4

あなたが説明することは、一般的にパラメーター スニッフィングと呼ばれ、SQL Server のみの問題のようです。Oracle IME で発生したことはなく、MySQL での問題を認識していません。私が提供したリンクは、問題をうまく解決しています。

オプティマイザーが使用する統計は、データの変更と同期されないことに注意してください。場合によっては、 UPDATE STATISTICSも時々実行する必要があります。

于 2010-07-29T17:21:51.890 に答える
0

ddl を変更すると、ストアド プロシージャの実行プランはキャッシュから削除されますが、OMG Ponies が述べているように、オプティマイザはデータの変更を追跡しません。

この問題を回避する 1 つの方法は、With Recompile オプションを使用することです。これにより、実行するたびにプロシージャがコンパイルされます。別の考えられる解決策は、sp_recompile を定期的に実行して、ストアド プロシージャを再コンパイルするようにマークすることです。

于 2010-07-29T17:29:43.093 に答える