我有一个linq查询,它导致了一些超时问题。基本上,我有一个查询,它从一个包含大约500,000条记录的表中返回前100个结果。
下面是查询:
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 =>
}
}奇怪的是,导致超时的是第一个linq查询。我认为,通过做一个'Take‘,我们不需要扫描所有500k的记录。然而,这肯定是正在发生的事情。我猜是为了找到“可搜索的”而加入的,导致了这个问题。我不能解除表格的正规化。所以我想知道是否有一种方法可以重写linq查询,让它更快地返回...或者我应该把这个查询写成一个存储过程(如果是这样的话,它可能是什么样子的)。谢谢。
发布于 2010-04-30 04:42:56
首先,我要找出正在生成的查询(在LINQ to SQL中,您将在数据上下文上设置日志),然后在SQL Server Management Studio中对其进行分析。使用它,直到您找到足够快的东西(通过更改查询或添加索引),如果您必须更改查询,了解如何在LINQ中表示它。
我怀疑问题是你将OrderBy和Take结合在一起--这意味着它可能需要找出所有的结果,以便找出前100名应该是什么样子。是否对Code进行了索引?如果没有,请尝试对其进行索引-这可能会有所帮助,因为它允许服务器按照返回记录的顺序考虑记录,这样在找到100条记录后就可以停止。您也应该查看其他列的索引。
https://stackoverflow.com/questions/2740611
复制相似问题