2003年 7月 1日 | 「INDEX-only」 の簡単な例 | >> 目次 (テーマ ごと) |
以下の データ 構造を前提にする。 顧客 { 顧客番号、顧客名称 } [ R ] 商品 { 商品番号、商品名称、商品単価 } [ R ] 受注 { 受注番号、顧客番号 (R)、商品番号 (R)、受注日、受注数 } [ E ] |
画面と 「キー の定義表」 は以下を前提にする。
|
受注照会画面 | |||
顧客番号: | 顧客名称: | ||
受注番号: | 受注日: | ||
商品番号: | 商品名称: | 受注数: | 商品単価: |
顧客 テーブル | N+M | key-1 | ||||||||
顧客番号 | ○ | 1 | ||||||||
顧客名称 | 2 |
受注 テーブル | N+M | key-1 | ||||||||
受注番号 | 2 | 2 | ||||||||
顧客番号 (R) | 1 | 1 | ||||||||
品目番号 (R) | 3 | |||||||||
受注日 | 4 | |||||||||
受注数 | 5 |
商品 テーブル | N+M | key-1 | ||||||||
商品番号 | ○ | 1 | ||||||||
商品名称 | 2 | |||||||||
商品単価 | 3 |
(1) 顧客 テーブル、受注 テーブル および商品 テーブル に対する DDL
CREATE INDEX (顧客番号, 顧客名称). (2) 顧客 テーブル に対する DML
SELECT 顧客名称 (3) 受注 テーブル の対する DML
SELECT 商品番号 受注日 受注数 (4) 商品 テーブル の対する DML
SELECT 商品名称 商品単価
テーブル に対する アクセス は、一切、ない。 たとえば、複数の商品を表示するとしても、それらの商品は インデックス のなかで昇順に並んでいるので、「order-by」 を記述しなくてもよい。
対象となる データ 件数が多ければ多いほど、table-scan の 「CREATE INDEX」 に比べて、「INDEX-Only」 は I/O 回数の少ない 「驚異的な」 高 パフォーマンス を実現する。 なお、「INDEX-only」 は、複合選択条件 (「AND」 あるいは 「OR」 を使った検索) において、「AND」 にも 「OR」 にも使うことができる--「OR」 を使って 2つ以上の カラム が合致しても、同一ROW の カラム であれば、検索結果として、1つの ROW しか表示しない (DB2 および ORACLE で動作確認済み)。
「INDEX-only」 は、たしかに、「驚異的な」 高 パフォーマンス を実現するが、万能薬ではない。
(1) データ 件数が少ないと効果がない。
(2) テーブル に対する更新 (ADD, CHANGE, DELETE) が多いことを前提にすれば、
(3) データ の ロード がおそくなる。
(4) インデックス・エリア が大きくなる。データ・エリア よりも大きくなることがある。
そして、なによりも、テーブル を完全な正規形にしておかなければならない。 [ 多量 データ および多量 トランザクション を前提とする ] 基幹系の システム に対して RDB を使って、「驚異的な」 高 パフォーマンス を実現するためには、以下の点を配慮すればいい。
(1) テーブル が完全な正規形であること。
基幹系 システム というのは定型なので、アクセス・パス が、ほぼ、限られている。
なお、「INDEX-only」 を実行する際には、かならず、SQL の 「execution-plan」 を検証してほしい。 次回は、「I/O 計算」について述べる。 |
<< もどる | ベーシックス | すすむ >> | |
データベースの基礎知識 |