2010-02-02 52 views
2

我有一个要求在包含200,000个条目的表中查找行。有些人可能不认为这个“大”,但它足够大,以保证性能考虑。用Linq和SQL Server搜索匹配子字符串的最佳技术

表中包含只由数字串。例如,用户可以输入诸如“12340-0560-78”之类的东西,或者其部分,例如, “0560”,我需要匹配值

12345678和 123405678和 等

这些国家数据中心,国家药品代码,并不顾标准,制造商在通过各种方式对其进行格式化在其条形码的各个位置添加或省略零。

我开始了让LINQ的做工作,从搜索字符串删除零和非数字字符,并从中取出全部为零之后,使用载有()在列。这太慢了。

所以我加了一个计算列的表,包含搜索栏减去全部为零。这样更好,但由于Contains(),我仍然在进行表扫描。

然后我创建了一个全文索引,但后来发现与全文索引我不能搜索子,只为单词,短语,和前缀。奇怪,但它不能解决这个问题。

还有其他选择吗?

回答

1

如何只建立在计算列一个简单的聚集索引。那么表现还好吗?

例如

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 
) 
... 
+0

我忘了提及 - 我在计算列上创建了一个索引,否则它不会提供任何优势。它现在可以正常工作,除非有更好的答案出现,否则我会接受你的。 – cdonner 2010-02-04 12:39:00

0

我仍然给全文索引一试,但你必须以某种方式准备索引的文本。

这个想法是创建一个单独的ndc_suffixes列并填充所有后缀ndc。也就是说,对于ndc = '1234567890'ndc_suffixes将是'1234567890 234567890 34567890 ... 890 90 0'。这可以是computed persisted column。由于国家自然科学中心的长度大约为10位,因此ndc_suffixes将需要合理的存储空间(并且无论如何它都可以移动到单独的表格中)。

然后,full-text prefix searchndc_suffixes可以用来获取字符串匹配。另外一个检查ndc like '%560%'可能是必要的,以过滤伪造匹配,但这一个将运行在一个显着减少的行集。