1

ストアドプロシージャがEntityFrameworkから非常に遅く実行されるという興味深い問題を発見しました。私はすでに問題を解決しましたが、誰かが解決策が機能する理由を教えてくれるかどうか聞きたいです。

問題

タイプDATETIMEの@dateパラメーターを受け取るストアドプロシージャGetLoginCountがあります。このストアドプロシージャをデータベースで直接実行すると、1秒以内に実行されます。Entity Frameworkを介してアプリケーションを実行する場合、約45秒かかります。

ストアドプロシージャでWITHRECOMPILEを使用して、サーバーの実行プランをクリアして、正しいインデックスを使用していない実行プランの低速バージョンがキャッシュされていないことを確認しました。

2日間の実験の後、早送りすると、ストアドプロシージャの先頭に次のようにDECLARE @date1 DATETIME = @date入力すると、代わりに@ date1を使用すると、同じくEntityFrameworkからストアドプロシージャが1秒で実行されることがわかりました。

なぜ?

私は自分の問題を解決しました。それはすべて問題ありませんが、この特定の解決策が機能する理由を知る必要があります。

4

1 に答える 1

1

マーティン・スミスはコメントで正しい答えを出しましたが、彼はそれを答えとして入れていないので、ここに挿入します。それで、質問を答えとして正しくマークすることができます。

「変数に割り当てて変数を使用すると、パラメーターのスニッフィングが無効になります。つまり、SQL Serverには特定の日付がなくなり、統計で検索して選択性の見積もりを取得し、OPTIMIZEFORUNKNOWNに従って推測することができます。」

OPTIMIZE FOR UNKNOWNを使用すると、実際に問題が解決します。

于 2012-09-04T10:42:00.097 に答える