0

次のようなコードがあります。

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倍長く実行されている理由を説明していません...

4

1 に答える 1

1

EF が引き起こす既知の問題のようArithabortです。次のコードは機能しますが、何らかの理由でExecuteStoreCommand機能しません。

var cmd = ((EntityConnection)db.Connection).StoreConnection.CreateCommand();
cmd.Connection.Open();
cmd.CommandText = "set arithabort on";
cmd.ExecuteNonQuery();

詳細については、この質問に対するこの回答を参照してください。

于 2013-05-08T11:43:26.593 に答える