2010-09-06 16 views
6

我有這樣的查詢:什麼指標應建立優化與多個OR條件SQL查詢

SELECT * 
FROM T 
WHERE A = @A AND ([email protected] OR [email protected] OR [email protected] OR @E=E) 
ORDER BY F 

我要補充什麼指標來提高查詢性能?此外,我需要實現分頁,這樣這個查詢將更加複雜。 (A,B,F),(A,C,F),(A,D,F)(A,E,F),但我不是當然,因爲我還沒有足夠的數據,所以無法真正測試它。

有沒有人有一些經驗分享?謝謝。

+0

在Oracle中,您有位圖索引,您只需創建5個單獨索引(在A上,在B上...)以覆蓋它們的所有組合。它適用於低基數列(即具有相當有限數量的可能值,如性別和顏色)。試着谷歌像MS SQL替代甲骨文位圖索引。希望它有幫助 – 2010-09-06 07:31:20

+0

我會嘗試。謝謝 – Marko 2010-09-06 07:38:33

+2

另外,要小心;索引可能會減少觸發SELECT查詢所需的時間,但它們可以大幅增加插入所花費的時間。這是我們之前在生產數據庫中不得不處理的事情。 – Rob 2010-09-06 07:44:34

回答

4

指數通常不會幫助您處理這種OR邏輯不知道您獲得了多少數據或對象的複雜性我只能主觀地說,但使用union查詢來排序數據往往更快。

SELECT * from T 
WHERE a= @a and B= @b 
UNION 
SELECT * from T 
WHERE a= @a and c= @c 
UNION 
SELECT * from T 
WHERE a= @a and d= @d 
union 
SELECT * from T 
WHERE a= @a and e= @e 
+0

只是想告訴同樣的事情 – 2010-09-07 07:08:54

+0

請注意,聯盟刪除重複,所以你的方法可能會很慢 – 2010-09-07 14:40:15

+1

它是一個有效的點;這會複製原始查詢的功能,而不是使用或方法更謹慎的索引。根據我對高數據流失數據庫的經驗,聯合方法比大型覆蓋索引更有效,因爲行創建和刪除的索引成本太高。 – u07ch 2010-09-07 15:22:03

1

覆蓋指標應該做。

created nonclustered index ([IDX_Cover]) 
on dbo.Table (columns to select) 
include (columns in where clause) 

記住,select *不容易索引。相反,索引你所需要的。

+0

'select *不容易索引'?什麼索引將被使用的問題取決於where子句,而不是select子句。 – 2013-09-09 02:19:58