在大桌面上搜索文本的最有效方法是什么?

时间:2012-01-17 09:57:48

标签: c# sql-server wcf optimization

我需要在一个约150,000行的表上搜索文本字段(varchar 500)。

我尝试的第一个选项是直接在db服务器上执行存储过程,如下所示:

Select p.ProductID, 
    p.ProductDescription, 
    p.SalesPrice 
From Products p 
Where p.ProductDescription Like '%' + @PartialDescription + '%'

结果很慢。即使使用ProductDescription索引,性能也不够快。

我想出的下一个解决方案可以按照以下步骤进行:

  1. 将整个Products表读入Type of Type Product并缓存它。
  2. 每当我需要进行搜索时,我会浏览该集合并进行字符串比较,如下所示

    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;
    
  3. 此解决方案比直接在数据库中搜索快一点。 通过在内存中缓存表,它可以在很大程度上避免数据库调用。 然而,它与遗留系统(在10多年前在FileMaker上构建)的比较仍然很慢。 我无法访问遗留系统的源代码,对此也不太了解。

    使用MS SQL Server 2008数据库,使用System.Runtime.Caching上的ObjectCache编写的C#代码和缓存,我希望我的解决方案能够轻松胜过旧系统。令人尴尬的是,事实并非如此。 如何优化我的搜索方法?我究竟做错了什么?上面的函数驻留在WCF服务中,并由Web应用程序使用(basicHttpBinding)而没有任何花哨的控件。我该怎么做才能让它更快?

    直接搜索数据库,对于任何类型的优化,它是否是更好的解决方案?我该如何优化呢?

3 个答案:

答案 0 :(得分:5)

如果您使用的是MS SQL 2008,我建议使用全文搜索。在表上启用FT索引,然后按照FTS提示搜索文本。

答案 1 :(得分:4)

因为您正在使用通配符前缀搜索值,所以将无法使用索引,因此它将始终执行表扫描。

您可以查看Full Text Search

答案 2 :(得分:1)

  

即使使用ProductDescription索引,性能也不够快。

初学者的SQL:

  

'%'+ @PartialDescription +'%'

Triggersa全表扫描,由于beginnign“%”而无法使用索引。标准索引是用于搜索单个单词的用法。

如果你可以处理删除 - 那么基本上你得到索引使用并应立即返回

  

在一个约150,000行的表上

玩具尺寸。除非你以2GB的vps运行。

我会删除%或转到全文索引。