【问题标题】:Best technique to search for matching substrings with Linq & SQL Server使用 Linq 和 SQL Server 搜索匹配子字符串的最佳技术
【发布时间】:2011-01-12 05:12:58
【问题描述】:

我需要在包含 200,000 个条目的表中查找行。有些人可能不会认为这个“大”,但它足够大,可以考虑性能。

该表包含仅由数字组成的字符串。例如,用户可以输入诸如“12340-0560-78”之类的内容,或者其中的一部分,例如'0560',我需要匹配值

12345678 和 123405678 和 0123456780等

这些是 NDC,即国家药品代码,尽管有标准,但制造商通过在其条形码的不同位置添加或省略零以各种方式对其进行格式化。

我开始让 Linq 完成这项工作,方法是从搜索字符串中删除零和非数字字符,并在删除所有零后在列上使用 Contains()。这太慢了。

所以我在表中添加了一个计算列,其中包含搜索列减去所有零。这更好,但由于 Contains(),我仍在进行表扫描。

然后我创建了一个全文索引,但意识到使用全文索引我无法搜索子字符串,只能搜索单词、短语和前缀。奇怪,但它并没有解决这个问题。

还有其他选择吗?

【问题讨论】:

    标签: sql-server linq-to-sql full-text-search substring


    【解决方案1】:

    我仍然会尝试全文索引,但您必须以某种方式准备文本以进行索引。

    这个想法是创建一个单独的ndc_suffixes 列并使用ndc 的所有后缀填充它。也就是说,对于ndc = '1234567890'ndc_suffixes 将是'1234567890 234567890 34567890 ... 890 90 0'。这可以是computed persisted column。由于 NDC 的长度约为 10 位,ndc_suffixes 将占用合理的存储空间(无论如何都可以将其移到单独的表中)。

    然后full-text prefix search 上的ndc_suffixes 可用于获取子字符串匹配。此外,可能还需要额外检查 ndc like '%560%' 以过滤掉虚假匹配,但这项检查将运行在显着减少的一组行上。

    【讨论】:

      【解决方案2】:

      在计算列上创建一个简单的聚集索引怎么样。那么表现还可以吗?

      例如

      CREATE TABLE [dbo].[foo](
          [code] [varchar](20) NULL,
          [ccol]  AS (replace(replace([code],'-',''),' ','')
      ) ON [PRIMARY]
      

      CREATE CLUSTERED INDEX [IX_foo] ON [dbo].[foo] 
      (
          [ccol] ASC
      )
      ...
      

      【讨论】:

      • 我忘了提 - 我确实在计算列上创建了一个索引,否则它不会真正提供任何优势。目前还可以,除非有更好的答案出现,否则我会接受你的。
      猜你喜欢
      • 1970-01-01
      • 2013-08-15
      • 2012-08-12
      • 2013-09-13
      • 1970-01-01
      • 2019-11-29
      • 2016-07-01
      • 1970-01-01
      • 2013-07-13
      相关资源
      最近更新 更多