2010-11-08 16 views
1

我的查詢是這樣的:如何優化JOIN ON LIKE「%」 +名字+「%」

SELECT * 
    FROM dbo.TestTable TT 
    JOIN dbo.fnListParseAndSplit('test,tt,zz,er,ts',',') L ON TT.Name like '%' + L.ListMember + '%' 

我的問題是,在執行計劃我總是得到索引查找這兩種情況下加入的時候:

  1. T.Name LIKE '%' + L.ListMember + '%'

  2. T.Name像L.ListMember + '%'。

我認爲他們是完全不同的,當加入像'%'+ L.ListMember +'%'我應該得到一個索引掃描。 執行計劃中出現錯誤嗎?或者SQL Server 2008非常聰明,它可以優化我的查詢?

我附上執行計劃。你知道爲什麼我要在TestTabe名稱列上找索引嗎?名稱列有一個唯一的索引...但在這種情況下,我期望掃描而不是查找。

http://softrun.ro/executionplan.png

+0

道歉,我誤解了你在編輯之前所要求的。 – JNK 2010-11-08 19:16:34

+0

沒問題......我不擅長SQL,但我很難解釋這個問題。 – 2010-11-08 19:20:56

+0

請問什麼是查詢計劃? XML還是圖形? – gbn 2010-11-08 20:15:24

回答

1

索引查找有關加盟的第一部分,如果你看貼的計劃,你會看到表掃描爲您解析函數的輸出。

+0

上查找但是索引seek是被選中的那個,以及在LIKE'%'+ L.ListMember上執行連接的索引+'%'。如何能有一個索引尋求? – 2010-11-10 12:36:15

+0

因爲內部連接涉及2個表(關係)並且兩個記錄都需要處理。在確定最佳執行計劃時,查詢優化器會檢查fnListParseAndSplit()函數的輸出,並決定使用TableScan作爲訪問返回記錄的最佳方法。然後它查看連接的另一部分(TestTable),並發現參與連接的列的索引IX_TestTable。所以最好的計劃是:TableScan on函數,IndexSeek on TestTable。 – 2010-11-11 08:27:09