我需要在一个约150,000行的表上搜索文本字段(varchar 500)。
我尝试的第一个选项是直接在db服务器上执行存储过程,如下所示:
Select p.ProductID,
p.ProductDescription,
p.SalesPrice
From Products p
Where p.ProductDescription Like '%' + @PartialDescription + '%'
结果很慢。即使使用ProductDescription索引,性能也不够快。
我想出的下一个解决方案可以按照以下步骤进行:
每当我需要进行搜索时,我会浏览该集合并进行字符串比较,如下所示
List<Product> searchResultItems = new List<Product>();
for (int i = 0; i < cachedProducts.Count; i++)
{
Product p = cachedProducts[i];
if (p.Description.IndexOf(partialDescription, StringComparison.OrdinalIgnoreCase)>=0)
{
searchResultItems.Add(p);
}
}
return searchResultItems;
此解决方案比直接在数据库中搜索快一点。 通过在内存中缓存表,它可以在很大程度上避免数据库调用。 然而,它与遗留系统(在10多年前在FileMaker上构建)的比较仍然很慢。 我无法访问遗留系统的源代码,对此也不太了解。
使用MS SQL Server 2008数据库,使用System.Runtime.Caching上的ObjectCache编写的C#代码和缓存,我希望我的解决方案能够轻松胜过旧系统。令人尴尬的是,事实并非如此。 如何优化我的搜索方法?我究竟做错了什么?上面的函数驻留在WCF服务中,并由Web应用程序使用(basicHttpBinding)而没有任何花哨的控件。我该怎么做才能让它更快?
直接搜索数据库,对于任何类型的优化,它是否是更好的解决方案?我该如何优化呢?
答案 0 :(得分:5)
如果您使用的是MS SQL 2008,我建议使用全文搜索。在表上启用FT索引,然后按照FTS提示搜索文本。
答案 1 :(得分:4)
因为您正在使用通配符前缀搜索值,所以将无法使用索引,因此它将始终执行表扫描。
您可以查看Full Text Search。
答案 2 :(得分:1)
即使使用ProductDescription索引,性能也不够快。
初学者的SQL:
'%'+ @PartialDescription +'%'
Triggersa全表扫描,由于beginnign“%”而无法使用索引。标准索引是用于搜索单个单词的用法。
如果你可以处理删除 - 那么基本上你得到索引使用并应立即返回
在一个约150,000行的表上
玩具尺寸。除非你以2GB的vps运行。
我会删除%或转到全文索引。