web-dev-qa-db-ja.com

インデックス:0%の断片化はBツリーを意味しますか?

現在、Microsoft SQL Serverとそのインデックス構造を扱っています。このためのデータ構造はツリーです。

テーブルインデックス(主キーなど)を再編成すると、結果は断片化が0%になります。次に、私の意見では、ツリーは最適に設定されています。これはまた、構造が B-tree 、つまり完全にバランスの取れたツリーであることを意味しますか?

3
n1kl4s

Bツリーの「B」は、必ずしも「バランスの取れた」という意味ではありません。それはあなたが誰に尋ねるかによる。たとえば this を参照してください。よくあることですが、用語は(時間とともに)低下します。

すべてのSQL Serverの「行インデックス」(ハッシュ、列ストア、フルテキスト、XML(ある程度)、地理空間などのSQL Serverの他のタイプのインデックスとは対照的)は、Bツリーインデックスです。ルートからすべてのリーフページまでの深さが同じ(ページ数)であるという意味で、これらは常に「バランスが取れています」。

これは、SQL Serverの世界で通常話している2種類の断片化(外部(リンクされたリストをたどるとジャンプする))または内部(完全でないページ)とは関係ありません。

葉は「データを持っている」ので、SQL Serverのクラスター化インデックスはB +ツリーと見なす必要があると主張できますが、ここでも、用語の使用方法に関する信頼できる参照を見つけられるとは思いません。

5
Tibor Karaszi

ドキュメント によると、SQL Serverのクラスター化インデックスは常にBツリーです。

SQL Serverでは、インデックスはBツリーとして編成されます。インデックスBツリーの各ページは、インデックスノードと呼ばれます。

非クラスター化インデックスと同様に:

非クラスター化インデックスのクラスター化インデックスと同じBツリー構造

インデックスの断片化は、物理的なストレージ(ページ)がどの程度適切に使用されているかを示すものであり、ツリーのバランスがどの程度とは言えません。また、インデックスがパーティション化されている場合、各パーティションはBツリーです。

SQLサーバーは、ツリーではないハッシュインデックス、ヒープ、メモリ最適化テーブルもサポートしています(MOTは Bw-trees -ロックのないBツリーバリアントを使用します)。

また、0%の断片化は必ずしも良いことではありません。これは、使用するメモリが可能な限り少なくなることを意味し、(比較の断片化の程度によっては)キャッシュの使用率が向上する可能性があります。また、新しいレコードを追加したり、古いレコードを更新したりするときに、より多くの作業が必要になる場合もあります。 SQL Serverで定期的にインデックスを最適化するのは良いことですが、やり過ぎないでください:)

3
Luaan