Oracleのインデックスのツリーのバランスが崩れる?
先日、某所でOracle DBの(b-treeの)インデックスのツリーのバランスが崩れる、という説を唱える人がいました。
何か自分の知らない用語の定義が行われているのかと不思議に思いましたが、謎のままその場は終わりました。会社に戻って、Oracleマスターに、Oracleのb-treeはツリーのバランスが崩れることがあるのかと聞きましたが、たぶん無いと思う、という回答でした。余談ながら、アリエルの良いところは、こうやって社内に知恵袋がいて色々と確認できるところです。
と言っても、Oracleでインデックスを作り直すと速くなる(ことがある)のは観測された事実のようです。
この理由に、ツリーのバランスが関係するのでしょうか?
インデックスを作り直して速くなる要因として最初に思いつくのは、sqliteで言及されている次の要因(b-treeのフラグメンテーション)です。
要は、b-treeのノードが物理ディスク上で分散してしまい、結果としてb-treeを走査する物理的な処理性能が落ちるというものです。ただ、DRH(sqlite作者)によれば、最初に多めのディスク領域を確保できれば、b-treeのフラグメンテーションは(相当)回避可能、と言っているので、Oracleで性能劣化の支配的要因ではないかもしれません。
以下のサイトによると、Oracleのレコードを削除した時、インデックスのb-treeのノードが空きノードとして残るようです。
b-treeに空きノードが増えて性能劣化が起きるのは様々なサイトで言及されています。b-treeのフラグメンテーションの1種です。これは性能劣化の理由として納得しやすい要因です。
以下PostgreSQLではフラグメンテーションの言及のみです。
以下のサイトではインデックスを再構築すべき指針をふたつ挙げています。
- http://www.dba-oracle.com/art_dbazine_idx_rebuild.htm
- 削除ノードの割合が20%以上
- ツリーの高さが4以上
前者はフラグメンテーションによるものです。後者はb-treeの次数が(ノード総数に対して)小さいためだと思います。
この文書を読むと、Oracleのインデックスが意外なほど謎であることがわかります。インデックスの再構築で速くなるのはプラシーボ効果だとという意見すら取り上げられています。
ここまでツリーのバランスが崩れるという言及はありませんでしたが、以下で見つけました。
うーん。この情報源はどこなんでしょう。日経だからテレビ東京かな。
結局、Oracleのインデックスのツリーのバランスが崩れる説は「日経レベルの信憑性」ということだけがわかりました。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/oracle-btree/tbping