マテリアライズド・ビュー検査では、クエリの全体または一部を計算するために使用可能な既存のマテリアライズド・ビューが判断されます。
マテリアライズド・ビューがクエリの一部と一致すると、最終クエリ実行プランでビューを使用するかどうかがコストベースで決定されます。列挙フェーズの役割とは、ビュー・マッチング・アルゴリズムで推奨されるビューが含まれるプランを生成し、プランの推定コストに基づいて最適なアクセス・プラン (マテリアライズド・ビューの一部が含まれることも含まれないこともある) を選択することです。
マテリアライズド・ビューがグループ化されたプロジェクト選択ジョイン・クエリ (「グループ化されたクエリ」、または GROUP BY 句を含むクエリとも呼ばれる) として定義されている場合、ビュー・マッチング・アルゴリズムはそのビューとグループ化されたクエリ・ブロックとを対応させることができます。マテリアライズド・ビューがプロジェクト選択ジョイン・クエリとして定義されている場合 (つまりグループ化されたクエリでない場合)、ビュー・マッチング・アルゴリズムはそのビューと任意のタイプのクエリ・ブロックを一致させることができます。
ビュー・マッチング・アルゴリズムによって、ビュー V がクエリ Q に属するクエリ・ブロック QB の一部と一致すると判断されるために必要な条件を次に示します。一般に、V には、クエリ QB のテーブルのサブセットが含まれている必要があります。唯一の例外は、V の拡張テーブルです。V の拡張テーブルは、V の他のテーブルのロー 1 つだけとジョインするテーブルです。たとえばプライマリ・キー・テーブルは、NULL でない外部キー・カラムとそのプライマリ・キー・カラムとの間で等価ジョインであるのが述部だけである場合に、拡張テーブルとなります。拡張テーブルを含むマテリアライズド・ビューの例については、例 2:グループ化されたプロジェクト選択ジョイン・ビューの一致を参照してください。
マテリアライズド・ビュー V を作成するためのオプションの値が、クエリを実行する接続のオプションの値と一致する。一致する必要のあるオプションのリストについては、マテリアライズド・ビューの制限を参照してください。
マテリアライズド・ビュー V の最後のリフレッシュが、materialized_view_optimization データベース・オプション、または SELECT 文の MATERIALIZED VIEW OPTIMIZATION 句 (指定されている場合) によって指定された古さのしきい値を超えていない。オプティマイザでのマテリアライズド・ビューに対する古さのしきい値の設定を参照してください。
V で使用されるすべてのテーブルが QB に存在する (ただし V の拡張テーブルの一部に例外がある可能性がある)。この QB の共通テーブルのセットをこれ以降 CT とします。
CT 内のテーブルは、クエリ Q で更新可能ではない。
CT 内のすべてのテーブルは、QB で外部ジョインの同じ側に属する (つまり、すべて外部ジョインの保護された側にあるか、すべて QB の外部ジョインの NULL 入力側にある)。
V の述部は、CT だけを参照する QB の述部のサブセットを包含することを判断可能である。つまり、V の述部は QB の述部よりも制限が少ない場合です。V の述部と正確に一致する QB の述部を「一致述部」と呼びます。
CT が一致述部で使用されていない場合に、この CT 内のテーブルを参照する QB の任意の式は、V の select リストに出現する必要がある。
V と QB の両方がグループ分けされている場合、QB は CT 内のテーブル以外にはテーブルを含まない。また、V の GROUP BY 句内の式のセットは、QB の GROUP BY 句内の式のセットと等しいか、そのスーパーセットである必要がある。
式の同一セットで V と QB の両方がグループ分けされている場合、QB 内のすべての集合関数も V で計算される必要があるか、または V の集合関数から計算できる。たとえば QB が AVG(x) を含む場合、V は AVG(x) を含むか、または SUM(x) と COUNT(x) の両方を含む必要があります。
QB の GROUP BY 句が V の GROUP BY 句のサブセットである場合、QB の単純な集合関数は V の集合関数内にある必要がある。また、QB の複合集合関数は、V の単純な集合関数から計算できる必要がある。単純な集合関数は次のとおりです。
単純な集合関数から計算できる複合集合関数は次のとおりです。
単純な集合関数を使用すると、次の統計集合関数を計算できます。
計算に使用される単純な集合関数は次のとおりです。
x1 は CAST(IFNULL(x, x,y) AS DOUBLE))、y1 は CAST(IFNULL(y,y,x) AS DOUBLE) をそれぞれ表します。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |