I have code like this:
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;
}
I was finding that this query was timing out. I ran SQL Profiler and grabbed the SQL and ran it in SSMS, and it came back in 7 seconds. From past experience, I've learned that this is invariably being caused by the Arithabort
option being set to 0
, which is why I run that first command. But it's still timing out.
I put a breakpoint on Line 4. When I hit the breakpoint, I went to SSMS, and ran the following query:
SELECT arithabort, * FROM sys.dm_exec_sessions s
WHERE program_name LIKE 'MyProg%'
As expected, Arithabort
is set to 1
. Then I stepped over Line 4, and immediately went back to SSMS to run that query... and suddenly Arithabort
has been set back to 0
!
Why? How to fix this?
EDIT: Well, I found a workaround, and it's more or less an answer, but not very satisfying.
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;
}
I inserted a line db.Connection.Open()
. Now Arithabort
maintains its original value. But that doesn't explain (a) why this is, and (b) why it's still running roughly 10 times longer than it takes in SSMS...