スケーラブルデータベースサーバ HiRDB Version 8 システム導入・設計ガイド(UNIX(R)用)

[目次][索引][前へ][次へ]

14.2.3 単一列インデクスと複数列インデクスの使い分け

インデクスには,単一列インデクスと複数列インデクスがあります。単一列インデクスとは,表の一つの列で作成した一つのインデクスのことです。複数列インデクスとは,表の複数の列で作成した一つのインデクスのことです。

<この項の構成>
(1) 単一列インデクスを作成する場合
(2) 複数列インデクスを作成する場合

(1) 単一列インデクスを作成する場合

一つの列をキーにして検索する場合に単一列インデクスを作成します。

(2) 複数列インデクスを作成する場合

次に示す場合に,複数列インデクスを作成します。

(a) 検索するデータを複数の条件を満たすデータだけに絞り込む場合

複数の列をキーとして,AND演算子を使用した複合条件検索をする場合など,複数の条件を満たすデータだけに絞り込んで検索する場合は,複数列インデクスを作成します。

例えば,次に示す表のC1,C2及びC3の三つの列をキー項目として複合条件検索をするとします。

SELECT 検索する列 FROM 検索対象の表 WHERE C1=10 AND C2=20 AND C3=30

この場合は,C1,C2及びC3のそれぞれの列に単一列インデクスを作成するのではなく,C1,C2及びC3の三つの列で構成する複数列インデクスを作成します。これによって,インデクスに対するアクセスと行に対するアクセスのオーバヘッドを削減できます。

なお,複合条件検索をする場合,複数列インデクスの第1構成列は,必ず「=」条件を指定する列にします。また,「=」条件を指定する確率が高い列ほど先に指定します。これによって,インデクス内の検索範囲を小さくできるため,インデクス内の検索時間を短縮できます。しかし,複数列インデクスの第1構成列に「=」条件を指定しない場合は,十分な効果が得られないときがあります。このような場合は,単一列インデクスを使用した方が効果があるときがあります。

(b) 探索条件でデータを絞り込んだ後,グループ分けやソートなどをする場合

探索条件として指定する列,グループ分け又はソートをする列の順で構成する複数列インデクスを作成します。

例えば,次に示す表のC1とC2の列をキーとして複合条件検索をして,検索結果をC3の列で降順,C4の列で昇順にソートするとします。

SELECT 検索する列 FROM 検索対象の表 WHERE C1=10 AND C2=20
  ORDER BY C3 DESC,C4 ASC

この場合も,C1とC2のそれぞれの列に単一列インデクスを作成するのではなく,C1,C2,C3及びC4で構成する複数列インデクスを作成します。このとき,C3の列の並びが降順,C4の列の並びが昇順になるようにします。これによって,インデクスに対するアクセスと行に対するアクセスのオーバヘッドを削減できます。

(c) 一つの表に作成した複数の複数列インデクスが,それぞれある列で重複している場合

例えば,一つの表に,C1とC2,C1とC3の列でそれぞれ構成する複数列インデクスを作成した場合,データを更新するとき,重複している列(C1の列)を更新するためのオーバヘッドが大きくなります。このオーバヘッドを削減するには,C1,C2及びC3の列で構成する一つの複数列インデクスを作成します。

なお,C1とC3の列に探索条件を指定して検索した場合は,検索性能が低下することがあります。

(d) 単一列インデクスと複数列インデクスの優先順位

表に単一列インデクスと複数列インデクスを作成している場合に,HiRDBが使用するそれぞれのインデクスの優先順位の例を次の表に示します。なお,次の表は,表を検索するときにC1=10 AND C2=20を指定した場合の例です。

表14-4 単一列インデクスと複数列インデクスの優先順位

インデクスを構成する列 優先順位
第1構成列 第2構成列 第3構成列
C1 C2 なし 1
C1 C3 C2 2
C1 なし なし 3
C1 C3 なし 4
C3 C2 なし 5