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

本文关键字:有效 方法 是什么 文本 搜索 | 更新日期: 2023-09-27 18:20:26

我需要在一个大约有150000行的表上搜索一个文本字段(varchar 500)。

我尝试的第一个选项是直接在数据库服务器上执行一个存储过程,它看起来像:

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

结果相当缓慢。即使使用ProductDescription上的索引,性能也不够快。

我提出的下一个解决方案分为以下步骤:

  1. 将整个"产品"表读取到"类型产品列表"中并将其缓存
  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;
    

这个解决方案比直接在数据库中搜索要快一点。通过将表缓存在内存中,它在很大程度上避免了数据库调用。然而,与传统系统(10多年前在FileMaker上构建)相比,它仍然很慢。我没有访问遗留系统的源代码,也不太了解它

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

直接搜索数据库,通过任何类型的优化,这是否是一个更好的解决方案?如何优化它?

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

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

因为搜索的是带有通配符前缀的值,所以索引将无法使用,因此它将始终进行表扫描。

你可以查看全文搜索。

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

面向初学者的SQL:

"%"+@PartialDescription+"%"

触发全表扫描时,由于起始值"%",无法使用索引。标准索引用于搜索单个单词。

如果你能处理删除它-那么基本上你可以使用索引,并且应该立即返回

在一张有大约150000行的桌子上

玩具尺寸。卸载您在2gb vps上运行的程序。

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