15. インデックス
- 15.1. インデックスとは
- 15.2. インデックスの基本構文
- 15.3. インデックスの利用
15.1. インデックスとは
インデックスとは、データの検索速度を向上させるために、どの行がどこにあるかを示した索引のことです。データを検索するときに、目的のデータが見つかるまですべての行を一行ずつ調べていくよりも、索引を利用して目的の行の場所を見つけてからその行のデータを読み取る方が効率的だという考えにより、非常によく用いられる方法です。
特に大きなテーブルでは、インデックスを用いることにより、大幅にそのパフォーマンスが改善されます。
15.2. インデックスの基本構文
インデックスの概念について SQL92 では定義されていません。ここでは ORACLE と PostgreSQL について説明します。
インデックスを定義するには、CREATE INDEX 文を使用します。基本構文は次の通りです。
<<ORACLE>>CREATE [UNIQUE] INDEX インデックス名 ON テーブル名(列名 [ ASC | DESC ],...) ;<<PostgreSQL>>
CREATE [UNIQUE] INDEX インデックス名 ON テーブル名(列名,...) ;
UNIQUE を指定すると、対象となる列の値に重複が許されなくなります。また、ORACLE では列名の後に ASC を指定すると昇順に、DESC を指定すると降順にインデックスが作成されます。指定しない場合は昇順になります。
定義したインデックスを削除する場合には、ORACLE も PostgreSQL ともに、次の DROP INDEX 文を使用します。
DROP INDEX インデックス名 ;
15.3. インデックスの利用
インデックスは、データ検索のパフォーマンスを改善するために利用されるものです。しかし、その利用の仕方が悪いと返ってパフォーマンスを低下させてしまうこともあります。インデックスを効率よく利用するために、次の点に注意する必要があります。
■パフォーマンス向上
- 表の結合条件に使用される列に対してインデックスを作成するとパフォーマンスが向上します。
- 値の分布が大きな列に対してインデックスを作成するとパフォーマンスが向上します。値の分布が大きいとは、異なる値が多いということです。
■パフォーマンス低下
- 値の分布が小さな列に対してインデックスを作成するとパフォーマンスが低下します。
- テーブルを更新すると、インデックスも更新されます。ですから、テーブルが頻繁に更新されるような場合にインデックスを利用するとパフォーマンスは低下します。
■その他
- インデックスは表のデータとは別の領域に保存されるので、データベース設計時にはインデックスの領域も見込まなければなりません。
- インデックスは表のデータに対して作成するもので、ビューのデータに対しては作成することができません。ただし、ビューに対してデータの検索を行う場合は、元のテーブルに作成されたインデックスが利用されます。
実習課題1
販売管理データベースから、支払った金額の大きいもの順に、顧客名と支払った合計金額を表示させたいとき、あらかじめどのテーブルのどの列にインデックスを定義しておけばよいか? PostgreSQL で、そのインデックスを定義する SQL 文を記述しなさい。一回あたりの支払い金額は、次の式で求めるものとする。複数台自動車を購入した顧客はそれらすべてを合計したものを支払い金額とする。
- (製品の価格) x (100 - (製品の値引率)) / 100 + (オプションの価格)
- = product.price x (100 - accept_order.dc_rate) / 100 + accept_order.option_price