2010-02-02 30 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%'可能是必要的,以過濾僞造匹配,但這一個將運行在一個顯着減少的行集。