16.20 - 例: NoPIテーブルとのHASH BYオプションの使用 - Teradata Database - Teradata Vantage NewSQL Engine

Teradata Vantage™ SQLデータ操作言語

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Release Date
2019年3月
Content Type
プログラミング リファレンス
Publication ID
B035-1146-162K-JPN
Language
日本語 (日本)

この例のために以下のNoPIテーブルを作成したとします。

     CREATE TABLE orders (
       o_orderkey    INTEGER NOT NULL,
       o_custkey     INTEGER,
       o_orderstatus CHAR(1) CASESPECIFIC,
       o_totalprice  DECIMAL(13,2) NOT NULL,
       o_ordertsz    TIMESTAMP(6) WITH TIME ZONE NOT NULL,
       o_comment     VARCHAR(79))
     UNIQUE INDEX (o_orderkey),
     PARTITION BY COLUMN;
     CREATE TABLE orders_staging AS orders
     WITH NO DATA
     NO PRIMARY INDEX;

以下のINSERT...SELECTリクエストは、o_orderkeyのハッシュ値ごとに行を再配置し、orders_stagingから選択されたデータが均等に配置され、ordersにローカルにコピーする前にo_ordertszについてランレングス圧縮がより向上するようローカルに整列されます。

     INSERT INTO orders
       SELECT *
       FROM orders_staging
       HASH BY o_orderkey
       LOCAL ORDER BY o_ordertsz;

HASH BY句の場合、o_orderkeyo_orderkeyテーブルのordersに解決されます。これは、orders_stagingからのo_orderkeyであるSELECTリクエストの選択式リストにおける最初の式に対応するため、Teradata Databaseはo_orderkeyでSELECTリクエスト用に生成されたスプールを分散します。同様に、Teradata Databaseはorders.staging.o_ordertszを使用して、ordersにローカルに挿入する前にスプールを整列します。

この例では同じテーブルを使用します。

     INSERT INTO orders
       SELECT o_orderkey, o_custkey, o_orderstatus, o_totalprice + 10,
              o_ordertsz, o_comment
       FROM orders_staging
       HASH BY o_totalprice;

HASH BY句の場合、o_totalpriceo_totalpriceテーブルのordersに解決されます。これはo_totalprice + 10であるSELECTリクエストの選択式リスト内で4つ目の式に対応するため、Teradata Databaseはorders_staging.o_totalpriceの値でなく、この式の値についてSELECTリクエストに生成されたスプールを分散します。

orders_staging.o_totalpriceの値について分散するには、以前のINSERT ... SELECTリクエストの次の改訂が行なわれるときにHASH BY句で参照を修飾します。

     INSERT INTO orders
       SELECT o_orderkey, o_custkey, o_orderstatus, o_totalprice + 10,
              o_ordertsz, o_comment
       FROM orders_staging
       HASH BY orders_staging.o_totalprice;