2010-03-16 66 views
4

我有一個由另一個開發人員編寫的函數,我試圖修改其中的一個稍微不同的用法。 SP用它來檢查DB中存儲的文本文檔中是否存在某個短語,如果找到該值,則返回1;否則返回0。這是查詢:SQL Server 05是最佳的,LIKE%<term>%或CONTAINS()用於搜索大列

SELECT @mres=1 from documents where [email protected] 
and contains(text, @search_term) 

該文檔主要包含XML,而search_term是格式化爲nvarchar(40)的GUID。

這對我來說似乎運行得非常慢(需要5-6秒來執行這部分過程),但是在同一個腳本文件中也有上述版本的註釋。

SELECT @mres=1 from documents where [email protected] 
and textlike '%' + @search_term + '%' 

該版本的運行速度更快,以4ms爲單位,第一個例子爲15ms。

所以,我的問題是爲什麼第一次使用第二個?我認爲這個開發人員(誰不再與我合作)有一個很好的理由,但目前我正在努力尋找它..

它可能與全文索引有關嗎? (這是一個我正在使用的開發數據庫,​​所以生產版本可能有更好的索引..)我並不是那麼關注FTI,所以目前還不太確定。思考/想法?

回答

1

更新: Aggg - 我所有的答案都是錯誤的!

是,CONTAINS確實使用全文搜索(見http://msdn.microsoft.com/en-us/library/ms187787.aspx)等應該是快(或至少應適當比例)

之所以(使用LIKE)的第二個版本可能會更快是如果你的表不包含很多行 - 調用全文引擎進行搜索將會產生一些額外的額外開銷,這可能意味着使用LIKE對於小型表格稍微快一些。

另一方面,如果頂部查詢需要5到6秒鐘執行,那麼我會說某處可能有錯誤 - 再次嘗試查看執行計劃。

0

總會有一種情況,其中一種選擇比另一種更快,反之亦然。您最好的選擇是測試生產中的相同查詢,並查看其差異。對於這種性能測試,我會推薦使用Profiler,並多次運行每個查詢,並將平均值進行比較。