2016-02-21 79 views
1

假設我有一個極大行5個字段的數據庫 - State(A)City(B),Category(C),Subcategory(d)和ID (E)。我將與極大數的查詢等SELECT ID打它,與WHERE條款,可以包含以下內容,用AND連接一起:最有效的方法做選擇分層查詢 - SQL服務器2014

A 
A,B 
A,C 
A,B,C 
A,C,D 
A,B,C,D 
C 
C,D 

換言之,它將只包括B,如果它包括A,和僅包括d如果它包含C,由於列的層次結構的性質。其中每個都會返回一個ID列表,這可能是許多行。

下面的技術會有好處嗎?

  1. (A,B)與化合物聚集索引上 (C,D)

  2. 創建兩個表,一個(X)與化合物聚簇索引,而另一個(Y)上以我的查詢的一部分{A,B}(如果有的話)並擊中 X;把我的查詢的一部分對{C,D}(如果有的話)和 對。

  3. 如果我打兩個表(即查詢包含的{A,B}{C,D}兩個部分),則相交於ID兩個表。

這會比僅對整個表進行完全查詢更高效嗎?我是否也應該在XY上爲ID製作第二個非聚集索引?

+0

不要以爲你可以通過分解成單獨的表來取代查詢優化器,從而分解成臨時表的特殊有序處理等。大多數情況下,如果你正確索引表(並且可能包括分區表),一切只是在封面下工作,你不需要複雜的過程。有時你需要使它變得複雜,但是首先嚐試正確的索引。 –

回答

0

如果您創建A,B,C,D一個索引,那麼它將幫助這些查詢:

A 
A,B 
A,B,C 
A,B,C,D 

這將一定程度上與這些查詢幫助:

A,C 
A,C,D 

它不會與這些查詢幫助:

C 
C,D 

如果您在上創建第二個索引10,這將有助於這些查詢:

C 
C,D 

如果在A,C,D創建第三個指標,它會與這些查詢幫助:

A 
A,C 
A,C,D 

所以,我把一切都在一個表中,並有三個指標就可以了。至於哪一個索引要聚集,很難說。我將從ID的簡單索引開始,這也是主鍵。上述


一切都假定您的查詢使用所有這些列與「平等」過濾器,像這樣:

WHERE A='ValueA' AND B='ValueB' and C='ValueC' 

如果某些過濾器不=,但>>=,然後索引可能不太有效。這取決於實際的過濾表達式。

+0

謝謝!所以可以做非聚集索引,即使我返回多行?我聽說這很糟糕。 – dashnick

+1

「東西不好」太廣泛。如果您關心性能,請嘗試使用硬件和實際大小的數據進行多種變體並進行比較。 **通常很糟糕,就是在沒有清楚地理解你爲什麼這樣做以及你正在獲得什麼的情況下對數據進行反規範化。 (比如將一個表拆分成兩個,如果它是一個實體的話,或者相反,如果兩個表是兩個實體,則將兩個表合併成一個)。當然,每個額外的索引都會使表的更新速度變慢,因此您正在爲'UPDATE/INSERT'速度交易'SELECT'速度。您應該衡量影響並決定是否可以接受。 –