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

Rom*_*meo 3 c# sql-server optimization wcf

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

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

Select p.ProductID, 
    p.ProductDescription, 
    p.SalesPrice 
From Products p 
Where p.ProductDescription Like '%' + @PartialDescription + '%'
Run Code Online (Sandbox Code Playgroud)

结果很慢.即使使用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;
    
    Run Code Online (Sandbox Code Playgroud)

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

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

直接搜索到数据库,它是一个更好的解决方案,任何类型的优化?我该如何优化它?

Alo*_*lok 5

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