次のようなコードがあります。
using (var db = new MyDataContext()) {
db.ExecuteStoreCommand("Set Arithabort on");
var q = AFairlyComplexQuery(db); // returns an IQueryable<>
var result = q.ToList(); // Line 4
return result;
}
このクエリがタイムアウトしていることがわかりました。SQL Profiler を実行し、SQL を取得して SSMS で実行したところ、7 秒で戻ってきました。過去の経験から、これは常にArithabort
オプションが に設定されていることが原因で0
あることがわかったので、最初のコマンドを実行しました。しかし、それはまだタイムアウトです。
4 行目にブレークポイントを設定しました。ブレークポイントに到達したら、SSMS に移動し、次のクエリを実行しました。
SELECT arithabort, * FROM sys.dm_exec_sessions s
WHERE program_name LIKE 'MyProg%'
予想どおり、Arithabort
に設定されてい1
ます。次に、4 行目をまたぐと、すぐに SSMS に戻ってそのクエリを実行しました... すると、突然!Arithabort
に戻りました。0
なんで?これを修正する方法は?
編集: まあ、私は回避策を見つけました。それは多かれ少なかれ答えですが、あまり満足のいくものではありません。
using (var db = new MyDataContext()) {
db.Connection.Open(); // INSERTING THIS LINE PRESERVES ARITHABORT
db.ExecuteStoreCommand("Set Arithabort on");
var q = AFairlyComplexQuery(db); // returns an IQueryable<>
var result = q.ToList(); // Line 4
return result;
}
行を挿入しましたdb.Connection.Open()
。現在Arithabort
は元の値を維持しています。しかし、それは(a)これがなぜなのか、(b)SSMSでかかる時間よりも約10倍長く実行されている理由を説明していません...