マテリアライズドビューを作成するときは、マテリアライズドビューの定義でカラム名を明示的に定義する必要があります。カラム定義の一部として SELECT *
構成要素を含めることはできません。
TIMESTAMP WITH TIME ZONE として定義されているカラムを、マテリアライズドビューに含めないでください。time_zone_adjustment オプションの値は、ロケーションと日付に基づいて、接続ごとに異なる値となる場合があるため、不正な結果や予期しない動作が発生することがあります。
マテリアライズドビューを作成するときは、マテリアライズドビューの定義に次の項目を含めることはできません。
グループ化されたプロジェクト選択ジョインのクエリブロックには select リストに COUNT(*) を含める必要があり、SUM と COUNT 集合関数のみを使用できます。
次のデータベースオプションでは、マテリアライズドビューを作成するときに特定の設定が必要です。そのように設定しない場合は、エラーが返されます。これらのデータベースオプションの値は、オプティマイザが使用するビューにも必要です。
次のデータベースオプションは、マテリアライズドビューを作成するときにマテリアライズドビューごとに格納されます。マテリアライズドビューが最適化で使用されるには、接続の現在のオプションの値がビューに対して格納された値と一致する必要があります。
ビューが再表示されるときは、上記の項目に示されたすべてのオプションの接続設定が無視されます。代わりに、データベースオプションの設定 (格納されたビューの設定と一致する必要がある) が使用されます。
マテリアライズドビューは、ローが特定の順序で格納されない点がベーステーブルに似ています。データベースサーバは、データの計算時に最も効率の良い方法でローを並べます。そのため、マテリアライズドビュー定義で ORDER BY 句を指定しても、ビューが実体化されるときのローの順序に影響はありません。また、ビューマッチングの実行時に、ビューの定義内の ORDER BY 句はオプティマイザによって無視されます。
手動ビューを即時ビューに変更するときには、次の制限が検査されます。ビューがいずれかの制限に違反している場合は、エラーが返されます。
sa_materialized_view_can_be_immediate システムプロシージャを使用して、手動ビューを即時ビューにする条件がそろっているかどうかを調べることができます。
ビューは未初期化状態である必要がある。
ビューに外部ジョインがない場合は、ビューの NULL 入力不可のカラムにユニークインデックスが作成されている。ビューに外部ジョインがある場合は、ビューの NULL 入力不可のカラムにユニークインデックスを作成するか、NULL 入力可のカラムにユニークインデックスを WITH NULLS NOT DISTINCT と宣言して作成してください。
ビューの定義がグループ化されたクエリである場合、ユニークインデックスのカラムは、集合関数ではない SELECT リスト項目に対応する必要がある。
ビューの定義に次のものを含むことはできない。
ビューの定義は、単一のプロジェクト選択ジョインまたはグループ化されたプロジェクト選択ジョインのブロックである必要があり、グループ化されたプロジェクト選択ジョインのクエリブロックには HAVING 句を含めることはできない。
グループ化されたプロジェクト選択ジョインのクエリブロックには、SELECT リストに COUNT(*) を含める必要があり、SUM と COUNT 集合関数のみを使用できます。
SELECT リストの集合関数は、複雑な式の中では参照できない。たとえば、SUM( expression ) + 1
は SELECT リストで使用できません。
SELECT リストに SUM( expression )
集合関数が含まれており、expression が NULL 入力可能な式である場合は、SELECT リストに COUNT( expression )
集合関数を含めます。
ビュー定義に外部ジョイン (LEFT OUTER JOIN、RIGHT OUTER JOIN、FULL OUTER JOIN) が含まれる場合は、ビュー定義が以下の追加条件を満たすようにしてください。
テーブル T が OUTER JOIN の ON 条件で保護側として参照されている場合は、T にはプライマリキーがあり、かつ、そのプライマリキーのカラムがビューの SELECT リストに含まれている必要があります。たとえば、SELECT T1.pk, R1.X FROM T1, T2 LEFT OUTER JOIN ( R1 KEY JOIN R2 ) ON T1.Y = R.Y
として定義された即時マテリアライズドビュー V において、ON 句で保護テーブル T1 が参照され、かつ、このテーブルのプライマリキーのカラム T1.pk が即時マテリアライズドビュー V の SELECT リストに含まれています。
外部ジョインの各 NULL 入力側については、NULL 入力不可のカラムのいずれかが即時マテリアライズドビューの SELECT リストに含まれているベーステーブルが、少なくとも 1 つ存在する必要があります。たとえば、SELECT T1.pk, R1.X FROM T1, T2 LEFT OUTER JOIN ( R1 KEY JOIN R2 ) ON T1.Y = R1.Y
と定義された即時マテリアライズドビュー V の場合、左外部ジョインの NULL 入力側はテーブル式 ( R1 KEY JOIN R2 )
です。カラム R1.X はテーブル R1 の NULL 入力不可のカラムであり、V の SELECT リストに含まれています。
ビューが GROUP 化されたビューであり、以前の条件が保持されていない場合は、外部ジョインの各 NULL 入力側に、ベーステーブル T (NULL 入力不可のカラムの 1 つである T.C が、即時マテリアライズドビューの SELECT リストの集合関数
COUNT( T.C )
で使用されている) を少なくとも 1 つ指定してください。たとえば、SELECT T1.pk, COUNT( R1.X ) FROM T1, T2 LEFT OUTER JOIN ( R1 KEY JOIN R2 ) ON T1.Y = R1.Y GROUP BY T1.pk
と定義された即時マテリアライズドビュー V の場合、左外部ジョインの NULL 入力側はテーブル式 ( R1 KEY JOIN R2 )
です。集合関数 COUNT( R1.X )
は V の SELECT リストに含まれており、R1.X はテーブル R1 の NULL 入力不可のカラムです。
外部ジョインを持つビューの述部が、以下の条件を満たすようにしてください。
LEFT OUTER JOIN、RIGHT OUTER JOIN、FULL OUTER JOIN の ON 句述部によって、保護テーブル式と NULL 入力テーブル式の両方が参照されていること。たとえば、T LEFT OUTER JOIN R ON R.X = 1
では、述部 R.X=1 によって NULL 入力側 R のみが参照されているため、この条件が満たされません。
ネストした外部ジョインによって生成された NULL 入力されるローが、すべての述部で拒否されること。つまり、述部で、ネストした外部ジョインによって NULL 入力されるテーブル式が参照されている場合は、その外部ジョインによって生成された、NULL を持つすべてのローが拒否されるようにします。
たとえば、ビュー V1 SELECT T1.pk, R1.X FROM T1, T2 LEFT OUTER JOIN ( R1 KEY JOIN R2 ) ON ( T1.Y = R1.Y ) WHERE R1.Z = 10
の述部の R1.Z=10
では、T2 LEFT OUTER JOIN ( R1 KEY JOIN R2 )
によって NULL 入力される可能性のあるテーブル R1 が参照されるため、NULL 入力されるすべてのローが拒否されるようにしてください。カラム R1.Z が NULL の場合、述部が UNKNOWN と評価されるため、このことが必要となります。
ただし、ビュー V2 SELECT T1.pk, R1.X FROM T1, T2 LEFT OUTER JOIN ( R1 KEY JOIN R2 ) ON ( T1.Y = R1.Y ) WHERE R1.Z IS NULL
はこのプロパティを持っていません。述部 R1.Z IS NULL
は NULL 入力側 R1 を参照していますが、テーブル R1 が NULL 入力される (つまり、R1.Z カラムが NULL) 場合は、TRUE と評価されます。NULL 入力されるローを拒否する方法は、NULL を許容しないプロパティと比較して制限が少なくなります。たとえば、述部
R.X IS NOT DISTINCT FROM T.X and rowid( T ) IS NOT NULL
は、T.X が NULL の場合に TRUE と評価されるため、テーブル T の NULL が許容されます。ただし、述部はベーステーブル T で NULL 入力されるすべてのローを拒否します。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |