2

我正在使用Oracle 12c數據庫。 我有一張桌子被查詢了很多。一個查詢使用where子句中的列A和B,另一個查詢使用where子句中的A,B,C和D列。我想加快查詢速度。Oracle索引包含另一個索引的所有列,對或錯

我已經添加2非唯一索引,一個在甲&乙和一個上甲&乙&Ç& d &ë,所以我的第二索引實際上包括第一索引列。這是正確的嗎?技術上錯誤?或者它取決於?

在這種情況下,在不同列上查詢表時,索引的最佳做法是什麼?指數有什麼影響?

回答

4

在這種情況下,假設您有索引(A,B,C,D,E),則不需要您的索引(A,B)。查詢可以有效地使用索引的前導部分。索引必須對索引進行維護,因此會對DML(索引,更新,刪除)產生影響。

話雖如此,優化器可能會選擇不使用索引並執行全表掃描,因爲它更便宜 - 這是正常的,正確的行爲。例如,如果我的表有100萬行,並且我的查詢返回其中的50%,那麼執行全表掃描可能會更好,而不是使用索引。

+0

感謝鮑勃。關於「......可以使用索引的LEADING部分」,如果我的第一個索引是C,D而不是A,B會怎樣? ABCDE指數是否也包含C,D指數?如果我也想C,D指數應該被聲明爲一個單獨的指數? –

+0

如果您的索引是(A,B,C,D,E),並且您在C,D上的位置,優化器*可能會使用索引跳過掃描操作。然而,這些都是難以準確計算成本的,而且往往表現不佳。在這種情況下,您可能只需要一個索引(C,D)。但是,不要發瘋,並開始索引每一個組合,因爲你會以索引膨脹結束! – BobC

+0

哈哈:)感謝鮑勃,我絕對不會用冗餘索引來打擊數據庫,我正在使用Google搜索優化解決方案來實現這一目標。 –