2010-11-24 374 views
4

我被告知並隨處閱讀(但沒有人敢於解釋爲什麼),當在多列上組合索引時,出於性能原因,我應該首先放置最具選擇性的列。 這是爲什麼? 這是一個神話嗎?多列索引列順序

+1

哇,很多問題的答案我不會讓 – milan 2010-11-24 07:25:33

回答

6

我應該把最有選擇性的列第一

According to Tom,列選擇性對使用的所有列的索引的查詢性能沒有影響(它會影響甲骨文的壓縮指數的能力)。

它不是第一件事,它不是最重要的東西。當然,這是值得考慮的事情,但它在事物的宏偉計劃中相對較遠。

在某些奇怪的,非常特殊和異常情況下(如上面真的完全偏斜數據),選擇性易事然而,他們 真正依賴的價值觀使用

一)非常罕見 B)在運行時,因爲所有傾斜的查詢都是

所以一般來說,看看你有的問題,儘量減少你需要的索引。

考慮 索引中的位置時,連接索引中列中不同值的數量不相關。

但是,在決定索引列順序時,應考慮這些因素。更重要的是確保索引對許多查詢有用,所以列順序必須反映這些列的使用(或者缺少)以用於查詢的where子句(出於AndreKR所闡述的原因)。

如何使用索引 - 這是決定時相關的內容。

所有其他的事情是平等的,我仍然會把最有選擇性的列首先。它感覺不錯...

更新:Another quote from Tom(感謝米蘭找到它)。

在Oracle 5(是的,第5版!),還有爲:首先將最有選擇性的列 索引中的一個參數。

從那時起,在指數 中首先放置最具區分性的條目將會使指數變得更小或更有效。它似乎會,但它不會。

隨着索引 密鑰壓縮,有一個引人注目的論據去相反的方式,因爲它可以使指數 更小。但是,如前所述,這應該由您如何使用指數來驅動。

6

使用索引時,可以省略從右到左的列,即當您有索引col_a, col_b時,可以在WHERE col_a = x中使用它,但在WHERE col_b = x中不能使用它。

想象一下,有一本電話號碼簿按姓氏排序,首字母爲,然後是

至少在歐洲和美國,名字的選擇性比姓氏低得多,因此查找名字不會縮小結果集,所以仍然會有很多頁面來檢查正確的姓氏。

+5

+1。如果領先的列丟失,您仍然可以使用索引,但它將是一個完整的索引掃描(或索引跳過掃描),這並不是那麼有效(儘管如此,仍可能比全表掃描更好)。 – Thilo 2010-11-24 01:38:32

+0

雖然這並不回答關於選擇性的部分。 – Thilo 2010-11-24 01:42:08

+0

我認爲至少在歐洲和美國,名字的選擇性比姓氏低得多,所以首先按名字排列的索引不會有太大的幫助。 – AndreKR 2010-11-24 01:43:44

2

索引中列的排序應該由您的查詢決定,而不是任何選擇性考慮因素。如果(a,b,c)有一個索引,並且大多數單列查詢都是針對c列的,然後是a,然後將它們按c,a,b的順序放在索引定義中以獲得最佳效率。 Oracle傾向於在查詢中使用索引的前沿,但可以在稱爲跳過掃描的效率較低的訪問路徑中使用索引中的其他列。

1

更具選擇性的是您的指數,最快的是研究。

簡單想象一個電話簿:你可以通過姓氏快速找到某人。但是,如果你有很多姓氏相同的人,那麼你每次都要查看姓氏,這樣你就會有更多的時間來尋找這個人。

因此,您必須先選擇最具選擇性的列,以儘可能避免此問題。

此外,您應該確保您的查詢正確使用這些「選擇性標準」。