3.6.6. WITH 句
Data Virtualization は、WITH
句を介して一般的なテーブル式へのアクセスを提供します。 WITH
句の項目をテーブルとして参照するには、後続の WITH 句項目とメインのクエリーで使用することができます。WITH
句は、クエリースコープの一時テーブルを提供することと考えることができます。
用途
WITH name [(column, ...)] AS [/*+ no_inline|materialize */] (query expression) ...
WITH name [(column, ...)] AS [/*+ no_inline|materialize */] (query expression) ...
構文ルール
- 展開された列名はすべて一意でなければなりません。一意でない場合は、列名の一覧を指定する必要があります。
- WITH 句項目の列が宣言されている場合は、クエリー式によって展開された列の数に一致する必要があります。
- 各 WITH 句項目には一意の名前を指定する必要があります。
-
オプションの
no_inline
ヒントは、クエリー式が参照されている場所のインラインビューとして置き換えないようにするオプティマイザーを示しています。ソースクエリーで必要な共通テーブルの複数の評価には、no_inline を使用できます。 -
オプションの
マテリアル化
ヒントでは、共通テーブルを Data Virtualization の一時的なテーブルとして作成する必要があります。これにより、共通テーブルの単一の評価が強制されます。
WITH 句も最適化の対象であり、後続のクエリーでは必要ありませんが、そのエントリーは処理されないことがあります。
一般的なテーブルは、プッシュダウンの可能性を強化するために積極的にインライン化されます。共通テーブルがメインのクエリーで 1 回のみ参照されている場合は、インラインになる可能性が高くなります。共通のテーブルを使用してプッシュ以外の相関サブクエリーの n 多重処理を行わない場合などに、no_inline
や materialize
ヒントを含める必要がある場合があります。
例
WITH n (x) AS (select col from tbl) select x from n, n as n1
WITH n (x) AS (select col from tbl) select x from n, n as n1
WITH n (x) AS /*+ no_inline */ (select col from tbl) select x from n, n as n1
WITH n (x) AS /*+ no_inline */ (select col from tbl) select x from n, n as n1
再帰的な共通テーブル式
再帰的な共通テーブル式は、それ自体を参照して、再帰的または反復方式で完全な共通テーブルを構築するために許可される一般的なテーブル式の特別な形式です。
用途
WITH name [(column, ...)] AS (anchor query expression UNION [ALL] recursive query expression) ...
WITH name [(column, ...)] AS (anchor query expression UNION [ALL] recursive query expression) ...
再帰クエリー式は、名前で共通テーブルを参照できます。アンカーのクエリー式は、処理中に最初に実行されます。結果は共通のテーブルに追加され、再帰クエリー式の実行に対して参照されます。このプロセスは、中間の結果がなくなるまで、新しい結果に対して繰り返し行われます。
再帰的でない共通テーブル式により、過剰な処理が発生する可能性があります。
デフォルトでは、再帰的な共通テーブル式の runaway 処理を防ぐために、処理は 10000 回に制限されます。プッシュされる再帰的な共通テーブル式はこの制限の対象ではありませんが、他のソース固有の制限が適用される可能性があります。セッション変数 teiid.maxRecursion
を大きな整数値に設定することで、制限を変更できます。制限を超えると、例外が発生します。
再帰制限が処理の完了前に到達するため、以下の例は失敗します。
SELECT teiid_session_set('teiid.maxRecursion', 25); WITH n (x) AS (values('a') UNION select chr(ascii(x)+1) from n where x < 'z') select * from n
SELECT teiid_session_set('teiid.maxRecursion', 25);
WITH n (x) AS (values('a') UNION select chr(ascii(x)+1) from n where x < 'z') select * from n