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

目次

概要

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

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

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

インデックス種類

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

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

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

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

インデックスの構造

インデックス ページ

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

によって構成される。

インデックス ページ

クラスタ化インデックス

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

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

クラスタ化インデックス

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

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

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

で構造が異なる。

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

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

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

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

DBの「データ ファイル」は、論理的な「セグメント」、物理的な「エクステント」から構成される。「セグメント」とは、テーブル、インデックスといった、オブジェクトを意味する。

SQL Server は、ディスクI/Oを、ディスク上管理単位である64KBの「エクステント」単位で処理する。また、「エクステント」は、メモリ上の管理単位である8KBの「ページ」から構成される。

「セグメント」、「エクステント」、「ページ」

データの追加、更新処理などで、「インデックス ページ」、「データ ページ」内の空き領域が埋まった場合、「ページ分割」が発生し、一部の「ページ」が、別の「エクステント」に格納されることがある。

例えば、SQL Serverでは「インデックス ページ」、「データ ページ」が埋まると、「ページ分割」により新しい行を挿入する余裕を作り出す。この作業にはコストがかかるため、DBサーバ全体のパフォーマンスを低下させる。「インデックスの断片化」は、「インデックス ページ」、「データ ページ」の「ページ分割」が進んだ状態を指す。

インデックスの断片化(ページ分割が進んだ状態)

「インデックスの断片化」が進んだ状態では、I/O 処理の連続性が失われ、別の「エクステント」から断片化した「ページ」を取得するという余分なI/Oが発生する。

インデックスの断片化による余分なI/Oの発生

一般的に、この状態はセグメント(テーブル、インデックス)を「再構築」することで解消できる。

「ページ密度」とは

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

「ページ密度」の設定

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

「FILLFACTOR」オプション

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

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

「PAD_INDEX」オプション


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