クエリー・リライトによる問合せ応答時間の改善

問合せをデータベースに送信するたびに非常に素早く答えが返されたら、素晴らしいと思いませんか。 残念なことに、実際には常にこれが起きるとは限りません。しかし、Oracle8iで導入されたクエリー・リライトはこの夢の実現を支援します。

クエリー・リライトは、応答を提供するためにすべての実データを読み取るのではなく、必要な情報が含まれたマテリアライズド・ビューを 透過的に読み取るため、非常に素早く問合せに応答することができます。マテリアライズド・ビューはOracle8iで導入された機能で、 特定期間における地域別の給与総額など、事前定義された問合せの結果が含まれています。使用可能な記憶領域に応じて、任意の数の マテリアライズド・ビューを定義できます。

クエリー・リライトは、セッションまたはシステム・パラメータQUERY_REWRITE_ENABLEDをTRUEに設定することによって 有効になります。クエリー・リライトが有効になると、マテリアライズド・ビューが使用可能であるかを調べるためにすべての SQL問合せがチェックされます。可能な場合はSQL問合せが透過的にリライトされ、マテリアライズド・ビューが使用されます。
そのため、マテリアライズド・ビューを利用するためにアプリケーションを変更する必要はなく、問合せの結果を非常に素早く 得ることができます。アプリケーション・コードに影響を与えないため、最新の問合せ処理負荷を反映させるためにマテリアライズド・ビューを連続的に変更することができます。

クエリー・リライトを使用するには、次に示すようにマテリアライズド・ビューを作成する必要があります。 このマテリアライズド・ビューは、月ごとの売上を事前計算します。

CREATE MATERIALIZED VIEW cal_month_sales_mv
BUILD IMMEDIATE   REFRESH COMPLETE   ENABLE QUERY REWRITE
AS
SELECT t.calendar_month_desc, sum(s.amount_sold) AS dollars
 FROM sales s, times t
 WHERE s.time_id = t.time_id
 GROUP BY t.calendar_month_desc;

SQL問合せは、必ずしも完全にマテリアライズド・ビュー定義に一致する必要はありません。 これは、クエリー・リライトでは次に示すようにいくつかの異なるタイプのリライト方法が使用されるためです。 そのため、クエリー・リライトは次のシナリオで可能になります。
  • 完全一致 - 問合せとマテリアライズドビューの結合条件とグループ化列が完全に一致します。
  • 集計 - たとえば、マテリアライズド・ビューが製品と月別にグループ化されているが、問合せは製品別である場合など。
  • ロールアップ - 問合せが四半期別で、マテリアライズド・ビューは月レベルであるが、 データを月から四半期にロールアップする方法を定義するディメンションが存在します。
  • ジョイン・バック - マテリアライズド・ビューの列を使用してディメンションにジョイン・バックされます (たとえば、マテリアライズド・ビューが店舗IDでグループ化されているが、問合せは店舗名による場合など)。
  • フィルタ処理されたデータ - マテリアライズド・ビューには、国UKとUSAなどのデータの一部のみが含まれていて、 問合せではUKのデータのみが要求されます。
問合せ結果はマテリアライズド・ビューを使用して返しますが、この時クエリー・リライトでは更新によって失効したデータであっても 読み取るか、失効している場合はリライトせずに実データを読み取るかどうかを選択できる整合性モードも提供します。 セッションまたはシステム・パラメータQUERY_REWRITE_INTEGRITYには、次の3つの値のいずれかを指定することができます。
  • STALE_TOLERATED - 最新のマテリアライズド・ビューと失効したマテリアライズド・ビューの両方を使用して 問合せ結果を返します。制約によって宣言されたすべての関係が適切であると信頼します。
  • TRUSTED - 最新のマテリアライズド・ビューのみを使用して、制約によって宣言されたすべての関係が適切であると信頼します。
  • ENFORCED - 最新のマテリアライズド・ビューのみを使用して、有効または検証済みのprimary/unique/foreignキー制約に 基づく関係のみを使用します。
Oracle9iでは、次のようにクエリー・リライトが大幅に改善されています。
  • マテリアライズド・ビューに実データの一部が含まれている場合、例えば、マテリアライズド・ビューの定義にBETWEEN 100 AND 250、 region_cd >=10 AND <=56, IN ('UK','USA',Canada')、 store_id = 100 OR store_id =200のような句が含まれている場合でも、クエリー・リライトでマテリアライズド・ビューを使用することができます。これにより、関心のあるデータのみが含まれたより小さくてコンパクトなマテリアライズド・ビューを作成することができます。

  • SQL文に指定されるDBMS_MVIEW.Explain_Rewriteと呼ばれるAPIにより、次のようなアドバイスが提供されます。
    • クエリー・リライトが行われるか
    • クエリー・リライトでどのマテリアライズド・ビューが使用されるか
    • クエリー・リライトが不可能な場合、なぜクエリー・リライトが実行されないのか

  • SQL問合せのFROMリスト内で自己結合と副問合せを含むSQL問合せをサポートします。
クエリー・リライトの拡張により、より少なく小さいマテリアライズド・ビューを使用して、より多くの問合せにクエリー・リライトを 適用できるようになりました。そのため、Oracle9i は、マテリアライズド・ビューによってパフォーマンスを改善できる問合せの範囲を拡大します。

追加情報
 Oracle9i Database マニュアル(ドキュメント) - パフォーマンス&レプリケーション - Oracle9iデータ・ウェアハウス・ガイド - 第22章 クエリー・リライト
 Oracle9i Database 技術資料 - Business Intelligence (データ・ウェアハウス) - Oracle9i のマテリアライズド・ビュー

Oracle9i Database Daily Feature
 アーカイブ