しばらく前に、ユーザーの1人に対してかなり多く実行したクエリがありました。それはまだ進化して微調整されていましたが、最終的には安定して実行されたので、そこからストアドプロシージャを作成しました。
これまでのところ、とても正常です。
ただし、ストアドプロシージャは非常に低速でした。クエリとプロシージャの間に重要な違いはありませんが、速度の変化は大幅でした。
[背景、SQLServer2005を実行しています。]
フレンドリーなローカルDBA(ここではもう機能していません)は、ストアドプロシージャを一目見て、「パラメータのなりすまし!」と言いました。(編集:「パラメータスニッフィング」としても知られているようですが、検索しようとしたときのGoogleヒットの不足を説明している可能性があります。)
ストアドプロシージャの一部を2番目のプロシージャに抽象化し、この新しい内部プロシージャの呼び出しを、外部プロシージャと呼ばれる既存の外部プロシージャにラップしました。これは、元のクエリと同じくらい高速でした。
それで、何が得られますか?誰かがパラメータのなりすましを説明できますか?
のボーナスクレジット
- それを回避する方法を強調する
- 考えられる原因を認識する方法を提案する
- 状況を緩和するための代替戦略、たとえば統計、インデックス、キーについて話し合う