我有这样的代码:
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 倍......