ビットマップ・ジョイン・インデックスによるデータ・ウェアハウス処理の高速化
Oracle9i Enterprize Editionでは、大量のデータおよび非定型の問合せ処理を大幅に高速化できるビットマップ索引機能が含まれています。 複数の表の結合に対するビットマップ索引である「ビットマップ・ジョイン・インデックス」を使うと、結合する必要のあるデータ量を効率的に削減 し、事前に結合を行うもう一つの方法であるマテリアライズド・ビューよりも、はるかに高い効率でデータを格納できます。
ビットマップ・ジョイン・インデックスを最もよく理解するには、単純な例を見るのが一番です。データ・ウェアハウスに、 「売上」という名前のファクト表と、各カスタマの所在地を含む「カスタマ」という名前のディメンション表を持つスター・スキーマが含まれているとします。 ここで、カスマタの所在地別に売上を索引付けするビットマップ・ジョイン・インデックスを作成します。索引のSQLを次に示します。
CREATE BITMAP INDEX cust_sales_bji
ON Sales(Customer.state)
FROM Sales, Customer
WHERE Sales.cust_id = Customer.cust_id;
上記のビットマップ・ジョイン・インデックスを使用して、次の問合せを評価することができます。 この問合せでは、CUSTOMER表に対するアクセスは行われてすらいません。 問合せは、ビットマップ・ジョイン・インデックスと売上表のみを使用して実行されます。
SELECT SUM(Sales.dollar_amount)
FROM Sales, Customer
WHERE Sales.cust_id = Customer.cust_id
AND Customer.state = 'California';
CUSTOMER表が大規模なディメンション表である場合(カスタマベースのディメンション表には数千万のレコードが含まれることもあります)、 ビットマップ・ジョイン・インデックスはCUSTOMER表にアクセスする必要がないため、問合せ性能が飛躍的に向上します。 さらに、ビットマップ・ジョイン・インデックスはファクト表にビットマップ・インデックスのあるスター・クエリーでたびたび発生する、 キー反復やビットマップ・マージ処理などをいくつか排除することができます。
以下に、ビットマップ・ジョイン・インデックスを使用することで得られるパフォーマンスの向上を示すテスト・ケースを示します。 オラクル社のテスト・ケースでは、様々なサプライヤからの部品注文を追跡する仮想の製造業者のデータを使用しています。 ここでは、ファクト表Partsuppとディメンション表PartsおよびSuppliersに対して3つのビットマップ・ジョイン・インデックスを作成します。 使用する列は、Parts(Type)とSupplier(Nationkey)です。表のカーディナリティは次のようになっています。
Supplier 6,000,000行
Parts 300,000行
Partsupp 24,000,000行
列のカーディナリティは次のようになっています。
Parts(Type) :150 個別値 Supplier(Nationkey) :25 個別値
これらの表に対してビットマップ・ジョイン・インデックスを作成するには、次のSQLを発行します。
CREATE BITMAP INDEX Partsupp_Parts_Suppliers
ON Partsupp( Parts.Type, Supplier.Nationkey)
FROM Partsupp, Parts, Supplier
WHERE Partsupp.Suppkey = Supplier.Suppkey AND
Partsupp.Partkey = Parts.Partkey;
次の問合せは、PartsまたはSupplier表にアクセスする必要なく新しい索引によって完了することができます。
SELECT COUNT (DISTINCT ps.Suppkey),
AVG(ps.Supplycost), MAX(ps.Supplycost),MIN(ps.Supplycost)
FROM Partsupp ps, Supplier s, Parts p
WHERE ps.suppkey = s.suppkey AND ps.Partkey=p.Partkey AND
s.Nationkey= 24 AND p.Type='medium burnished steel';
上の問合せでは、Partsuppから6475行が返されます。Oracle8iの最良の結果は3つの表すべてのハッシュ・ジョインによるものですが、 Oracle9iではビットマップ・ジョイン・インデックスのアクセス・パスを使用して問合せが完了されます。 計測結果は次のとおりです。Oracle9iの7秒は、ディスクからすべてのブロックを読み取ったためです。 すべてのブロックがキャッシュされていれば、問合せは2秒で完了します。
|
Oracle8i |
Oracle9i |
差異 |
スピードアップ係数 |
問合せ応答時間 |
01:02 |
00:07 |
00:55 |
8.8x |
|
|