Closed4

SQL Serverのindexの仕組みについて

A KidA Kid

B-treeについて

A KidA Kid

SQL Serverのインデックスの種類

  • クラスタ化インデックス
    • インデックスのリーフノードに実レコードが含まれるもの
      • つまり、レコードをテーブルにどういう順で格納しておくか
    • テーブルにつき最大1つ
      • PKを指定なしで作ればデフォルトでクラスタ化インデックスになる
  • 非クラスタ化インデックス
    • インデックスのリーフノードにはレコードへのポインタを格納するもの
    • テーブルごとに何個でも作れる
    • 検索時は、非クラスタ化インデックスで目的のリーフノードを見つけた後に、(必要があれば)レコードへのポインタ(※)を使って改めてテーブルからレコードを検索する必要がある
      • クラスタ化インデックスがあればそのキー(普通はPK)をポインタとして使うっぽい
      • クラスタ化インデックスがなければRIDを使う?
  • カバリングインデックス
    • 非クラスタ化インデックスで検索したあとに実レコードにアクセスさせずに済むように、インデックスのキーに必要な列をすべて入れておくというメソッド
      • サイズがでかくなるので、普通は次項の付加列インデックスを使う
  • 付加列インデックス
    • リーフノードにのみ任意の列を追加できる
    • カバリングインデックスの改善版

参考)SQL Serverのインデックスの理解を深める

A KidA Kid
  • 実際にどのインデックスを使って検索するかは、SQL Serverがよしなに判断する
    • 期待通りになっているかどうかは実行プランを見て確認する必要あり
      • SSMS で Include Actual Execution Plan
  • 非クラスタ化インデックスのキーによる検索時、非クラスタ化インデックスで検索 → クラスタ化インデックスからレコード取得 になるかと思いきや、最初からクラスタ化インデックスで実レコードを探すほうが効率が良いと判断される場合もある
A KidA Kid

インデックスの断片化

参考)SQL Serverにおけるインデックスの再構成と再構築の性能比較

このスクラップは2024/02/11にクローズされました