【问题标题】:What is the most efficient way to search text on a big table?在大桌子上搜索文本的最有效方法是什么?
【发布时间】:2012-02-12 03:19:35
【问题描述】:

我需要在大约 150,000 行的表上搜索文本字段 (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.Caching 上的 ObjectCache 进行缓存,我期待我的解决方案能够轻松超越旧系统。尴尬的是,事实并非如此。 如何优化我的搜索方法?我究竟做错了什么?上面的函数驻留在 WCF 服务中,并由没有任何花哨控件的 Web 应用程序使用(basicHttpBinding)。我该怎么做才能让它更快?

直接搜索数据库,是否可以通过任何优化成为更好的解决方案?如何优化它?

【问题讨论】:

    标签: c# sql-server wcf optimization


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      由于您正在搜索带有通配符前缀的值,因此将无法使用索引,因此它将始终进行表扫描。

      您可以查看Full Text Search

      【讨论】:

      • 那么在数据库级别(使用 FTS)搜索是最好的吗?在应用层做这件事没有意义吗? (@Alok 也有同样的问题)有什么见解吗?
      • 恕我直言,除非您要处理少量行,否则我会在数据库级别进行。带回所有行并在应用程序层执行此操作对于大量数据来说并不是很好。
      【解决方案3】:

      即使在 ProductDescription 上有索引,性能也不够快。

      适合初学者的 SQL:

      '%' + @PartialDescription + '%'

      触发全表扫描,由于 beginnnign "%",不能使用索引。标准索引可用于搜索单个单词。

      如果您可以处理删除它 - 那么基本上您可以使用索引并且应该立即获得回报

      在大约 150,000 行的表上

      玩具尺寸。除非你在 2gb vps 上运行。

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

      【讨论】:

      • 一张有 150,000 行的表格对你来说是个“玩具”,是吗?先生,您是一个非常有智慧的人。 +1 非常鼓舞人心的评论。我现在要回到我的办公桌前玩玩具。谢谢。
      • 是的。我生活在一个每天将 4000 万行加载到表中的世界。我们在 7 分钟内处理了 450.000 个业务对象——其中一些具有近 20 万个详细信息行。 10 年前,150.000 还很小。 20 年前,foxpro 在处理具有 100 万个条目的行时没有问题。实事求是——今天你在较小的一端有 16GB 内存的工作站,有 250GB 内存的数据库服务器。
      猜你喜欢
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 2013-05-14
      • 1970-01-01
      • 2011-08-05
      • 2010-11-15
      相关资源
      最近更新 更多