部分インデックス(ぶぶんインデックス、: partial index)は関係データベース管理システムで用いられるインデックスの中で、特定の条件に適合するだけを含むものを指す。

インデックスの対象となるテーブルに多くの行が含まれていても、インデックスに含むキーを絞り込むことで、インデックスのサイズを小さく抑えられる利点がある。

処理状況をフラグ列として持つテーブルを例に挙げる。フラグには 'A' (アクティブ), 'P' (処理待ち), 'W' (処理中), 'F' (完了) があるとする。インデックスを使った検索が必要なのは 'A', 'P', 'W' のみである場合、以下のような部分インデックスを定義することができる。

  CREATE INDEX partial_flag ON txn_table (flag) WHERE flag in ('A', 'P', 'W');

このインデックスは フラグが 'F' の行を含まない。行の大半の処理が完了していると考えられるならば、フラグ 'F' の行を除外することでインデックスが含む行数を少なく抑えながら、検索できる必要のある行に対しては依然としてインデックスを使うことができる。

同様に、部分インデックスは、特定の列が NULL でない行だけを含むように定義することもできる。大半の行のその列が NULL であるならば大きな利益が見込める。

   CREATE INDEX partial_object_update ON object_table (updated_on) WHERE updated_on IS NOT NULL;

このインデックスを使って以下のクエリを実行すると、更新日を持つ (updated_on IS NOT NULL) 行を効率良く取得できる。

   SELECT * FROM object_table WHERE updated_on IS NOT NULL ORDER BY updated_on;

部分インデックスの条件は、キーと異なる列でも良い。以下のようなインデックスも定義できる。

   CREATE INDEX partial_salary ON employee(age) WHERE salary > 2100;

サポート 編集

  • Microsoft SQL Server はバージョン 2008 以降でサポートしており、「フィルタ選択されたインデックス」と呼んでいる。[1]
  • PostgreSQL はバージョン 7.0 (2000-05-05) 以降でサポートしている。[2]
  • MySQL 5.4 では部分インデックスをサポートしていない。[3]

脚注 編集

  1. ^ フィルタ選択されたインデックスのデザイン ガイドライン”. SQL Server オンライン ブック. Microsoft. 2009年8月29日閲覧。
  2. ^ リリースノート 7.0”. PostgreSQL 8.4.0文書. PostgreSQL. 2009年8月29日閲覧。 “Allow creation of functional indexes to use default types”
  3. ^ Razzoli, Federico (2008年10月5日). “Bug #4990 Functional Indexes”. bugs.mysql.com. 2009年7月14日閲覧。

外部リンク 編集