2009-11-19 43 views
2

我在SQL Server 2008中大(1TB)表看起來是這樣的:如何最好做一個部分文本匹配在SQL Server 2008

ID int | Flag BIT | Notes NTEXT

我需要搜索的每一行以及在Flag位設置爲1,其中說明包含的單詞flip

UPDATE Table SET Flag = 1 
WHERE Notes LIKE '%flip%' 

「最好」的方式做到這一點?

我在想這可能需要幾天才能在如此大的桌子上運行。我試過運行

SELECT TOP (10) * FROM Table 
WHERE Notes LIKE '%flip%' 

它在10分鐘後仍然運行 - 所以性能看起來不太好。

創建一個C#應用程序來讀取/更新每一行是一個更好的方法。至少我可以在沒有鎖定桌子的情況下做一些改動。

我應該考慮其他方法嗎?

+2

請注意,全文索引對您在此處指定的後綴或中期模式匹配沒有幫助(即前導通配符術語搜索)。 http://stackoverflow.com/questions/1758393/is-there-an-efficient-way-to-index-inside-words-in-sql-server-2008/1758480#1758480 – chadhoc 2009-11-19 15:03:33

+1

你可能還會注意到ntext是不建議使用,您需要將字段定義更改爲nvarchar(max)。 – HLGEM 2009-11-19 15:46:21

回答

3

我建議運行一個像上面那樣的選擇(沒有top 10子句),以便將要更新的記錄的ID(假設Id已建立索引)提取到臨時登臺表中。您的選擇將掃描整個表格,但這比在更新語句中這樣做要好。如果您可以使用Read Committed Snapshot Isolation,,那麼對於併發會更好。如果您需要使用循環方法,即迭代地檢查一小組記錄,請使用ID(或某個可搜索列)作爲主要過濾器,以獲取大量記錄以進行模式匹配並繼續,直至完成。即這樣的事情:

Select top x id 
From Table 
where Id between 1 and 100000 
And  Textcolumn like('%blah%') 

然後繼續迭代,直到你點擊所有的ID範圍。

然後,一旦您有要更新的ID,請針對這些更新運行更新。

像德米特里說的,前10名選擇仍然會掃描整個表for this type of query,所以這隻會減慢你的速度。一旦擁有這些ID或可以查詢查詢的內容,就可以包含頂部x子句以降低併發影響,但如果您有大量記錄影響,這可能只有意義。

+0

謝謝chadhoc。這很好。 – 2009-11-19 19:06:15

2

你試過full text indexing

+0

謝謝德米特里。但我想快速解決這個問題。添加全文索引將永遠放在這個大小的表格上,這可能是過度殺傷。 – 2009-11-19 12:55:36

+2

我不認爲有一個快速的解決方案,因爲這樣的查詢不能使用任何索引,所以他們必須掃描整個表格,並匹配您的模式的每一行。你的桌子是1TB大,所以需要時間。除非你在不同的機器上獲取你的表的一部分並且並行地處理它們(這可能是矯枉過正的),你幾乎無法在客戶端做更好的處理。 – Dmitry 2009-11-19 13:05:31

+0

同樣參見上面的內容,但全文搜索將無助於給定術語/單詞中的後綴或前導通配符搜索。 http://stackoverflow.com/questions/1758393/is-there-an-efficient-way-to-index-inside-words-in-sql-server-2008/1758480#1758480 – chadhoc 2009-11-19 15:04:47

相關問題