I have a huge table which I need to read through on a certain order and compute some aggregate statistics. The table already has a clustered index for the correct order so g
After madly grasping at some straws, I found that the DataContext
's ObjectTrackingEnabled = false
could be just what the doctor ordered. It is, not surprisingly, specifically designed for a read-only case like this.
using (var readOnlyDataContext =
new MyDataContext(_conn) {CommandTimeout = really_long, ObjectTrackingEnabled = false})
{
var logs =
(from record in readOnlyDataContext.someTable
where [index is appropriate]
select record);
foreach( linqEntity l in logs )
{
// Do stuff with data from l
}
}
The above approach does not use any memory when streaming through objects. When writing data, I can use a different DataContext
that has object tracking enabled, and that seems to work okay. However, this approach does have the problem of a SQL query that can take an hour or more to stream and complete, so if there's a way to do the paging as above without the performance hit, I'm open to other alternatives.
A warning about turning object tracking off: I found out that when you try to do multiple concurrent reads with the same DataContext
, you don't get the error There is already an open DataReader associated with this Command which must be closed first.
The application just goes into an infinite loop with 100% CPU usage. I'm not sure if this is a C# bug or a feature.