これは私がこれまでの私の研究から学んだことです。
.NETは管理スタジオにログインしたときと同じ接続設定で送信します。ここでは、SQLプロファイラとの接続を盗聴場合は見るものである。
-- network protocol: TCP/IP
set quoted_identifier off
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls off
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed
のSQL Serverにログインしたときに、私は今の設定が同じであることを確認するために、私は実行するすべてのクエリ上で設定したものを貼り付けています。
このケースでは、切断して再接続した後に個々の設定を試したところ、arithabortをoffからonに変更すると問題のクエリが90秒から1秒に短縮されました。
最も可能性の高い説明は、SQL Serverが最も効果的なクエリプランであると考えるものを選択するために使用する、パラメータスニッフィングに関するものです。接続設定の1つを変更すると、クエリオプティマイザが別のプランを選択する可能性があります。この場合、不正なプランが選択されている可能性があります。
しかし、私はこれを完全には確信していません。私はこの設定を変更した後に実際のクエリプランを比較しようとしましたが、diffが変更を表示するのをまだ見ていません。
場合によってはクエリが遅く実行される可能性のあるarithabort設定について他に何かありますか?
解決策は単純だったようです。set arithabortをストアドプロシージャの一番上に置くだけです。しかし、これは逆の問題につながる可能性があります。クエリパラメータを変更すると、突然、 'on'よりも 'off'で速く実行されます。
当面は、 'with recompile'プロシージャを実行して、毎回計画が再生成されることを確認しています。この特定のレポートでは、再コンパイルするのに1秒かかることがあるため、これは大丈夫です。レポートにはそれほど目立たないので、戻ってくるのに1〜10秒かかります(それはモンスターです)。
しかし、頻繁に実行され、できるだけ早く数ミリ秒で復帰する必要がある他のクエリではオプションではありません。
私は同じ問題があり、http://stackoverflow.com/questions/250713/sqldataadapter-fill-method-slowが私の問題を解決しました – David