【发布时间】:2019-01-23 11:34:14
【问题描述】:
我们正在使用 LINQ 过滤 SQL 表以查找列中的数据以在另一个表中找到的任何子字符串开头的记录(具有长前缀列表的查找表)。
我们已经按照this link 中的解决方案尝试了 StartsWith,但它只适用于 EF。
但this post 确实为 LinqToSQL 提供了正确的解决方案。
问题是在大桌子上速度很慢。我们的姓氏表有 100 万条记录,查找表大约有 50 000 条。
这是我们当前代码的示例。我们如何提高性能?
(比较的所有字段部分都已打开索引)
var lookupList = LookupTable.Select(p => p.Prefix);
var q = from p in dc.Personnel
where lookupList.Any(x => p.Surname.ToUpper().IndexOf(x) >= 0)
select new
{
Surname = p.Surname
};
【问题讨论】:
-
您确定这与 EF 或 Linq2SQL 有关吗?在这样的数据库中进行大量文本查找可能会非常缓慢。您能否编写一个足够快的 SQL 查询?
-
我还没有尝试编写自己的 SQL,因为这确实是最后的手段。由于维护等优点,首选Linq。
-
你真的应该看看生成的 SQL 代码。但除此之外,
StartsWith和IndexOf >= 0并不相同,并且会产生截然不同的性能影响。 -
我的意思不是嵌入 SQL,而是说您不能编写能够快速完成此操作的 SQL 查询。文本查找速度非常慢。
-
你的前缀总是一样长吗? > 然后将相应的预截断值存储在 Personnel 表的新索引列中,并与相等性进行比较。
标签: c# performance linq linq-to-sql