17.00 - 17.05 - 述部の後付けと後出し - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLリクエストおよびトランザクション処理

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
ユーザー ガイド
Publication ID
B035-1142-170K-JPN
Language
日本語 (日本)

述部後付けを調整するとは、できるだけ多くの行とできるだけ多くの列を削除して、クエリーのコストを最小限に抑えるために、演算をできる限りクエリー処理の始めに移動するということです。Teradataの並列環境では、BYNET経由で他のAMPに移動しなければならない行数を減らすため、この操作が特に重要になります。クエリー処理は構文解析ツリーの下部で開始されるので、これらの述部はツリーにされると言われます。解析ツリーの概念については、述部の後付けと同様、内部表記への変換で説明しています。

述部を後付けすると、折り重ねることができないビューおよび派生テーブル用のスプールのカーディナリティが減るため、パフォーマンスが向上します。

クエリー リライトと最適化では、述部の後出しは後付けほど使用されません。一般的な目的は、コストのかかる演算を処理キューのさらに後ろに移動し、処理対象の行と列を少なくして、その他の問合わせの書き換えが実行された後に演算するようにすることです。クエリー処理は構文解析ツリーの下から開始するため、このような述部はツリーに後出しされると言われます。

この書き換え方法は、可能な場合に、包含問合わせブロックからビューまたは派生テーブル内に述部を後付けします。

述部の後付けと後出しの例

次のリクエストがあるとします。

     SELECT MAX(total)
     FROM (SELECT product_key, product_name,
           SUM(quantity*amount) AS total
           FROM Sales, Product
           WHERE sales_product_key=product_key
           GROUP BY product_key, product_name) AS v
     WHERE product_key IN (10, 20, 30);

述部を後付けすることにより、このリクエストの外部WHERE句述部を派生テーブルvに移動して、それをvのWHERE句の一部として評価できます。

述部を後付けすると、折り重ねることができないビューおよび派生テーブル用のスプールのカーディナリティが減るため、パフォーマンスが向上します。

述部後付けの重要な要素は、スプールされたビューまたはスプールされた派生テーブルへの条件の後付けを実行することです。この書き換えでは、ビューを参照する条件を分析し、ビュー定義の基本テーブルにそれらの条件をマッピングし、次いでそれらをビュー定義に付加します。このような書き換えにより、ビューの具体化が向上する可能性があります。

例えば、次のクエリーの派生テーブル(x,y,z)について考えてみます。

    SELECT *
    FROM (SELECT *
          FROM t1) AS dt(x,y,z)
    WHERE x=1;

問合わせ内の派生テーブルがスプールされる場合、条件a1=1をそれに後付けできます。この書き換えにより、次のクエリーが生成されます。

    SELECT *
    FROM (SELECT *
          FROM t1
          WHERE a1=1) AS dt(x,y,z)
    WHERE x=1;

元のクエリーはフル テーブル スキャンt1をリクエストしましたが、書き換えられたクエリーは、t1の単一AMPアクセスのみをリクエストすることに注意してください。a1はt1のプライマリ インデックスと仮定します。

次の別のビュー定義およびそれに対する特定のクエリーを考慮してください。

    CREATE VIEW v (a, b, c) AS
      SELECT a1, a2, SUM(a3)
      FROM   t1, t2, t3
      WHERE  b1=b2
      AND    c2=c3
      GROUP BY a1, a2;

    SELECT v.a, v.b
    FROM v, t4
    WHERE v.a=a4 ;

ビュー列v.cは包含クエリー ブロックで参照されていないので、このリクエストのビュー定義の書き換え選択リストから、SUM(a3)の項を削除できます。このアクションにより、ビューのスプールのサイズが削減され(ビューがスプールされる場合)、集約の項SUM(a3)の不必要な計算も排除されます。

射影の後付けにより、他の書き換えも有効にできます。例えば、次のテーブル定義があるとします。

    CREATE TABLE t1 (
      a1 INTEGER NOT NULL,
      b1 INTEGER,
      PRIMARY KEY (a1) );

    CREATE TABLE t2 (
      a2 INTEGER,
      b2 INTEGER,
      FOREIGN KEY (a2) REFERENCES t1);

t1への参照が派生テーブルの選択リストから除去される場合に、以下のリクエストに結合の排除を適用できます。

    SELECT 1
    FROM (SELECT *
          FROM t1,t2
          WHERE a1=a2) AS dt;