2011-04-26 40 views
2

我有一個查詢,看起來像這樣查詢是否可以爲表使用多個非聚集索引?

SELECT TOP 1000 C.iId_company 
FROM dbo.Company AS C WITH(NOLOCK) 
WHERE 
C.col_1 LIKE 'something%' 
OR C.col_1 LIKE 'something2%' 
OR C.col_1 LIKE 'something3%' 
OR C.col_2 LIKE 'something%' 
OR C.col_2 LIKE 'something2%' 
OR C.col_2 LIKE 'something3%' 

我試圖使該查詢更快,我嘗試添加上COL_1和COL_2指標。如果我註釋col_2的條件,那麼對於col_1,查詢是非常快的,同樣的事情(如果我註釋掉關於col_1的條件)。但是當我這樣離開時,這是一個老故事,非常緩慢。

我對執行計劃的看法是,一次只能使用一個索引,SQL在使用第一個索引後執行子集掃描。我嘗試了不同的東西(使兩列的索引,但也不工作)

其實我唯一的解決方案是拆分查詢和使用UNION。有沒有辦法讓這種查詢更快,並保存在一個查詢中?

+0

如果您嘗試「OPTION(FORCESEEK)'提示會怎麼樣?那麼這是否會做索引工會? – 2011-04-26 15:02:14

+0

@Martin在這種情況下,你不可以在這兩列上創建一個索引嗎? – rsbarro 2011-04-26 15:06:35

+0

@rsbarro。如果他們創建了一個複合索引'col1,col2'或'col2,col1',那麼它只能分別查找col_1 LIKE'%'或'col_2 LIKE'某些%''。它仍然需要掃描整個索引以確定其他「OR」標準。 – 2011-04-26 15:09:18

回答

2

使用聯合。那就是:

SELECT TOP 1000 C.iId_company 
FROM dbo.Company AS C WITH(NOLOCK) 
WHERE 
C.col_1 LIKE 'something%' 
OR C.col_1 LIKE 'something2%' 
OR C.col_1 LIKE 'something3%' 

union all 

SELECT TOP 1000 C.iId_company 
FROM dbo.Company AS C WITH(NOLOCK) 
WHERE 
C.col_2 LIKE 'something%' 
OR C.col_2 LIKE 'something2%' 
OR C.col_2 LIKE 'something3%' 

根據需要調整(例如,您可能需要來包裝整個事情的選擇,這樣就可以通過子句添加一個爲了得到什麼,你認爲是頂1000)。但我認爲你會對這個解決方案感到滿意。

+0

使用UNION ALL附加兩個結果集可能會產生重複行,因此最終從此聯合中選擇的表達式可能需要發出SELECT DISTINCT,或者上面的查詢可能會使用UNION並導致該級別的排序。 – 2011-04-26 16:20:10

+0

這就是我想要避免的。我已經能夠生成該查詢。 (在我的問題中的最後一行) – MaxiWheat 2011-04-26 17:46:08

+0

@Fred:你說得對。我認爲從組合中獲得前1000名的工作效率要稍高一些,而不是在聯盟中做出獨特的選擇。 – 2011-04-26 18:06:22

0

您的要求指出需要兩個單獨的索引,每個索引都需要一個索引。使用您喜歡的任何DBA工具生成並查看查詢的解釋計劃。現在,您可以開始重新查詢查看解釋計劃是否看起來比以前的嘗試更好。您可能需要使用UNION或公用表表達式將兩個查詢組合到一個結果集中。

相關問題