Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

インデックスがないテーブルには基本的にデータの並び順に保証がないため、
これ検索する場合は、性能的に遅い「テーブル スキャン」を実行する。
このため、検索処理の効率化のために、検索条件に対応した「インデックス」を作成する。

SQL Serverのインデックスには、

の2種類のインデックスがある。

インデックス種類

「クラスタ化インデックス」

「クラスタ化インデックス」はOracleの「索引構成表」と同じであり、
「電話帳の50音順索引」のように、データが順番に並べられたインデックスのことを言う。

「非クラスタ化インデックス」

「非クラスタ化インデックス」はOracleの「索引」と同じであり、
「書籍の索引」のように、データとは別の領域に作られたインデックスのことを言う。

インデックスの構造

インデックス ページ

インデックスの構造について説明する。

によって構成される。

インデックス ページ

クラスタ化インデックス

次に、「クラスタ化インデックス」の構造について説明する。

「クラスタ化インデックス」は、テーブルで「クラスタ化キー(クラスタ化インデックスを作成する際に使用したキー)」を設定すると、
そのキー値の昇順にデータが並び替えられて、「リーフ レベル ページ」が実際の「データ ページ」として構成される。

クラスタ化インデックス

非クラスタ化インデックス

次に、「非クラスタ化インデックス」の構造について説明する。

で構造が異なる。

「クラスタ化インデックス」が存在しない場合の「非クラスタ化インデックス」

「クラスタ化インデックス」が存在しない場合の「非クラスタ化インデックス」

「クラスタ化インデックス」が存在する「非クラスタ化インデックス」

「クラスタ化インデックス」が存在する「非クラスタ化インデックス」の「リーフ レベル ページ」は同様に
「インデックス ページ」であるが、「ポインタ」として「行識別子」ではなく「クラスタ化キー」の値を格納している。

「クラスタ化インデックス」が存在する「非クラスタ化インデックス」

このため、「クラスタ化インデックス」が存在する「非クラスタ化インデックス」での検索は、

インデックスと選択度

「非クラスタ化インデックス」と選択度

「非クラスタ化インデックス」は、選択度の低い項目に対しては不利である。

「クラスタ化インデックス」と選択度

「クラスタ化インデックス」は、選択度の低い項目に対して"も"有効である。

計算式

1000(レコード) / 10(レコード / ページ) / 8(ページ / エクステント) ≒ 13エクステント ≒ 13回のI/O

※ SQL Server は、ディスクI/Oを、ディスク上管理単位である「エクステント」単位で処理する。

選択度と「ページ分割」

なお、選択度の低いデータでは、どちらのインデックスでも、
データの挿入時に、「ページ分割」が発生しやすくなり、不利である。

「ページ分割」については、
「インデックスの断片化」の管理」で説明する。

選択度の低い項目をキーにした「クラスタ化インデックス」の作成は、

のトレードオフを考慮する形になる。

「インデックスの断片化」の管理

「インデックスの断片化」とは

DBの「データ ファイル」は、

から構成される。

「セグメント」とは、テーブル、インデックスといった、オブジェクトを意味する。

SQL Server は、

「セグメント」、「エクステント」、「ページ」
インデックスの断片化(ページ分割が進んだ状態)
インデックスの断片化による余分なI/Oの発生

「ページ密度」とは

繋がる。このため、なるべく「ページ分割」が発生しないようにする必要がある。

「ページ密度」の設定

「ページ密度」は、「FILLFACTOR」オプションで設定することができる。

「FILLFACTOR」オプション

のオプションで指定できる。

の「ページ密度」を制御する。

「PAD_INDEX」オプション


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS