I have a linq query that is causing some timeout issues. Basically, I have a query that is returning the top 100 results from a table that has approximately 500,000 records.
Here is the query:
using (var dc = CreateContext())
{
var accounts = string.IsNullOrEmpty(searchText)
? dc.Genealogy_Accounts
.Where(a => a.Genealogy_AccountClass.Searchable)
.OrderByDescending(a => a.ID)
.Take(100)
: dc.Genealogy_Accounts
.Where(a => (a.Code.StartsWith(searchText)
|| a.Name.StartsWith(searchText))
&& a.Genealogy_AccountClass.Searchable)
.OrderBy(a => a.Code)
.Take(100);
return accounts.Select(a =>
}
}
Oddly enough it is the first linq query that is causing the timeout. I thought that by doing a ‘Take’ we wouldn’t need to scan all 500k of records. However, that must be what is happening. I’m guessing that the join to find what is ‘searchable’ is causing the issue. I’m not able to denormalize the tables… so I’m wondering if there is a way to rewrite the linq query to get it to return quicker… or if I should just write this query as a Stored Procedure (and if so, what might it look like). Thanks.
Well to start with, I’d find out what query is being generated (in LINQ to SQL you’d set the Log on the data context) and then profile it in SQL Server Management Studio. Play with it there until you’ve found something that is fast enough (either by changing the query or adding indexes) and if you’ve had to change the query, work out how to represent that in LINQ.
I suspect the problem is that you’re combining
OrderByandTake– which means it potentially needs to find out all the results in order to work out which the top 100 would look like. IsCodeindexed? If not, try indexing that – it may help by allowing the server to consider records in the order in which they’d be returned, so it can stop after it’s found 100 records. You should look at indexes for the other columns too.