Linq查询耗时太长
本文关键字:查询 Linq | 更新日期: 2023-09-27 18:06:32
我想知道是否有人可以帮助我。我有一个LINQ查询-没有问题,但它需要太长时间来返回数据
var result = Context.paf_wgs84.Where(c => c.Postcode.Contains(postcode)).Take(15);
非常简单,当用户输入时,使用AJAX,它返回一组15个可能的匹配。
问题是,有160万条记录
在管理工作室中运行以下代码大约需要3秒
SELECT code
FROM paf_wgs84
WHERE (code LIKE '%EC1%')
,其中运行以下代码所需时间不到一秒
SELECT TOP 15 code
FROM paf_wgs84
WHERE (code LIKE '%EC1%')
有没有一种方法可以在LINQ中做类似的事情而不使用.take()
?
您可以尝试这样做。这将只返回一列。
var result = Context.paf_wgs84.Where(c => c.Postcode.Contains(postcode)).Select(x=>new {x.Postcode}).Take(15);
生成的Sql语句如下所示:
/*
-- Region Parameters
DECLARE @p0 VarChar(1000) = '%s%'
-- EndRegion
SELECT TOP (15) [t0].[code]
FROM [paf_wgs84] AS [t0]
WHERE [t0].[code] LIKE @p0
*/
问题可能是你的包含方法在语句中它没有被映射到sql中的类似语句,你最终得到所有行到sql,然后在你的web层做一个包含搜索,而不是在你的DB做同样的。
使用SqlMethods内容如下:
SqlMethods.Like(c.Postcode, string.Format("%{0}%",postcode));
有时也可以使用字符串方法,如:string。StartsWith或String。以but结尾
Also - LIKE子句以%开头很少是一个好主意-尤其是,它不能有效地利用任何索引。使用"全文搜索"可能会有更好的性能;但这不能通过LINQ
直接获得我把语句改成
var result = Context.paf_wgs84.Where(c => c.Postcode.StartsWith(postcode)).Take(10).Select(c => c.Postcode).ToArray();
我使用foreach来添加字符串数组-我认为这是我浪费时间的地方!
谢谢大家的帮助。
使用新的FETCH和OFFSET语句,这些类型的查询的性能在SQL Server 2012中得到了极大的提高(尽管到目前为止我还没有看到太多的基准测试数据…)。
问题是EF还没有利用这些新特性。
一个可能的解决方案是使用SQL Server 2012和写一个sproc与FETCH/OFFSET,然后使用EF目标。当然这不是一个短期的解决方案,但我想指出这个选项。