17.05 - PRIMARY AMP - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 構文規則および例

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
Release Date
2021年1月
Content Type
プログラミング リファレンス
Publication ID
B035-1144-175K-JPN
Language
日本語 (日本)

基本AMPインデックス(PA)を使用します。

行は、列パーティション(CP)テーブルまたは列パーティション結合インデックス用に、各AMPにハッシュ分散されます。列パーティション値はそれぞれのAMP上で、内部パーティション番号と列パーティション テーブルまたは結合インデックス用の行ハッシュによって順序付けられます。

PRIMARY AMP句を指定する場合は、PRIMARY AMP句または、インデックス リストに単独で、列パーティション レベルを含めたPARTITION BY句を指定する必要があります。

PAを持つテーブルのデフォルトのテーブルの種類はMULTISETです。これはPAを持つテーブルでは変更できません。

INDEX
読みやすくするために、必要に応じてINDEXキーワードをAMPとともに指定できます。
index_name
基本AMPインデックスの名前。データベース オブジェクトの命名ルールについては、<Teradata Vantage™ - SQLの基本、B035-1141>を参照してください。
(index_column_name)
基本AMPインデックス列。複合プライマリ インデックスの場合、index_column_nameは括弧で囲まれたすべてのインデックス列のカンマ区切りリストを示します。派生PERIOD列の開始列または終了列を基本AMPインデックス内に指定することはできません。
行レベル セキュリティ制約列は、基本AMPインデックスの構成要素にできません。
プライマリAMPインデックスは、JSONデータ型またはDATASETデータ型で定義されている列には定義できません。

例: 列パーティションを持つ基本AMPインデックス

次の例では、基本AMPインデックスを持つ列パーティション(CP)テーブル用のCREATE TABLE文を示しています。

CREATE TABLE Sales1 (
    storeid         INTEGER NOT NULL,
    productid       INTEGER NOT NULL,
    salesdate       DATE FORMAT 'yyyy-mm-dd' NOT NULL,
    totalrevenue    DECIMAL(13,2),
    note            VARCHAR(256)
  )
  PRIMARY AMP INDEX (storeid, productid)
  PARTITION BY COLUMN;

このテーブルのデフォルトでは、各列は別個の列パーティション内にあり、それぞれの列パーティションに自動圧縮付きのCOLUMN形式があります。

次の問合わせの場合、これによって列パーティション排除を使用した単一のAMPステップが可能になります。このテーブルがプライマリ インデックスのないCPテーブルの場合、全AMPステップが必要になります。ステップ1で、この単一のAMP上の3つのユーザーの列パーティションと削除列パーティションがアクセスされます。

EXPLAIN
SELECT SUM(totalrevenue) FROM Sales1 s
WHERE s.storeid = 37 AND s.productid = 1466;

Explanation
---------------------------------------------------------------------------
  1) First, we do a single-AMP SUM step to aggregate from 4 column
     partitions of PLS.s by way of the primary AMP index "PLS.s.storeid =
     37, PLS.s.productid = 1466" with a condition of ("(PLS.s.productid =
     1466) AND (PLS.s.storeid = 37)").  Aggregate Intermediate Results are
     computed locally, then placed in Spool 3.  The size of Spool 3 is
     estimated with high confidence to be 1 row (23 bytes).  The estimated
     time for this step is 0.02 seconds.
  2) Next, we do a single-AMP RETRIEVE step from Spool 3 (Last Use) by
     way of the hash value of "PLS.s.storeid = 37, PLS.s.productid =
     1466" into Spool 1 (one-amp), which is built locally on that AMP.
     The size of Spool 1 is estimated with high confidence to be 1 row
     (36 bytes).  The estimated time for this step is 0.02 seconds.
  3) Finally, we send out an END TRANSACTION step to all AMPs involved
     in processing the request.
  -> The contents of Spool 1 are sent back to the user as the result of
     statement 1.  The total estimated time is 0.04 seconds.

例: 列パーティションと行パーティションを持つ基本AMPインデックス

次の例では、行パーティションと基本AMPインデックスを持つCPテーブル用のCREATE TABLE文を示しています。

CREATE TABLE Sales2 (
    storeid         INTEGER NOT NULL,
    productid       INTEGER NOT NULL,
    salesdate       DATE FORMAT 'yyyy-mm-dd' NOT NULL,
    totalrevenue    DECIMAL(13,2),
    note            VARCHAR(256)
  )
  PRIMARY AMP INDEX (storeid, productid)
  PARTITION BY (
      COLUMN,
      RANGE_N(salesdate BETWEEN DATE '2007-01-01' AND DATE '2014-12-31'
                                EACH INTERVAL '1' MONTH)
    );

このテーブルのデフォルトでは、各列は別個の列パーティション内にあり、それぞれの列パーティションに自動圧縮付きのCOLUMN形式があります。次の問合わせの場合、これによって列パーティション排除と行パーティション排除を使用した単一のAMPステップが可能になります。このテーブルがプライマリ インデックスのないCPテーブルの場合、全AMPステップが必要になります。ステップ1で、1つの行パーティションについて、この単一のAMP上の4つのユーザーの列パーティションと削除列パーティションがアクセスされます。

EXPLAIN
SELECT SUM(totalrevenue) FROM Sales2 s
WHERE s.storeid = 37 AND s.productid = 1466 AND s.salesdate = DATE '2012-05-21';

Explanation
---------------------------------------------------------------------------
  1) First, we do a single-AMP SUM step to aggregate from 5 combined
     partitions (5 column partitions) of PLS.s by way of the primary AMP
     index "PLS.s.storeid = 37, PLS.s.productid = 1466" with a condition of
     ("(PLS.s.storeid = 37) AND ((PLS.s.productid = 1466) AND
     (PLS.s.salesdate = DATE '2012-05-21'))").  Aggregate Intermediate
     Results are computed locally, then placed in Spool 3.  The size of
     Spool 3 is estimated with high confidence to be 1 row (23 bytes).
     The estimated time for this step is 0.02 seconds.
  2) Next, we do a single-AMP RETRIEVE step from Spool 3 (Last Use) by
     way of the hash value of "PLS.s.storeid = 37, PLS.s.productid =
     1466" into Spool 1 (one-amp), which is built locally on that AMP.
     The size of Spool 1 is estimated with high confidence to be 1 row
     (36 bytes).  The estimated time for this step is 0.02 seconds.
  3) Finally, we send out an END TRANSACTION step to all AMPs involved
     in processing the request.
  -> The contents of Spool 1 are sent back to the user as the result of
     statement 1.  The total estimated time is 0.04 seconds.

列パーティションとROW形式を持つ基本AMPインデックス

次の例では、1番目と3番目の列パーティション(適用可能な自動圧縮のない)にROW形式を使用する、基本AMPインデックスを持つ列CPテーブル用のCREATE TABLE文を示しています。1番目の列パーティションは、複数列パーティションです。自動圧縮は、2番目のtotalrevenue用の列パーティションに適用されます。

CREATE TABLE Sales3 (
    ROW(storeid          INTEGER NOT NULL,
        productid        INTEGER NOT NULL,
        salesdate        DATE FORMAT 'yyyy-mm-dd' NOT NULL),
    COLUMN(totalrevenue  DECIMAL(13,2)),
    ROW(note             VARCHAR(256))
  )
  PRIMARY AMP INDEX (storeid, productid)
  PARTITION BY COLUMN;

次の問合わせの場合、これによって列パーティション排除を使用した単一のAMPステップが可能になります。このテーブルがプライマリ インデックスのないCPテーブルの場合、全AMPステップが必要になります。ステップ1で、スキャンされるパーティションにROW形式が保持されているため、2つのユーザーの列パーティションがアクセスされます。この場合、削除列パーティションはアクセスされる必要はありません。これは、スキャンされるパーティションにROW形式が保持されているためです。

EXPLAIN
SELECT SUM(totalrevenue) FROM Sales3 s
WHERE s.storeid = 37 AND s.productid = 1466;

Explanation
---------------------------------------------------------------------------
  1) First, we do a single-AMP SUM step to aggregate from 2 column
     partitions of PLS.s by way of the primary AMP index "PLS.s.storeid =
     37, PLS.s.productid = 1466" with a condition of ("(PLS.s.productid =
     1466) AND (PLS.s.storeid = 37)").  Aggregate Intermediate Results are
     computed locally, then placed in Spool 3.  The size of Spool 3 is
     estimated with high confidence to be 1 row (23 bytes).  The estimated
     time for this step is 0.02 seconds.
  2) Next, we do a single-AMP RETRIEVE step from Spool 3 (Last Use) by
     way of the hash value of "PLS.s.storeid = 37, PLS.s.productid =
     1466" into Spool 1 (one-amp), which is built locally on that AMP.
     The size of Spool 1 is estimated with high confidence to be 1 row
     (36 bytes).  The estimated time for this step is 0.02 seconds.
  3) Finally, we send out an END TRANSACTION step to all AMPs involved
     in processing the request.
  -> The contents of Spool 1 are sent back to the user as the result of
     statement 1.  The total estimated time is 0.04 seconds.

例: 列パーティションとUSIを持つ基本AMPインデックス

この例では、基本AMPインデックスを持つ列パーティション テーブルを定義しています。基本AMPインデックスは固有で定義できませんが、固有(または非固有)セカンダリ インデックスを基本AMPインデックスと同じ列に定義できることに注意してください。各列は、システム決定のCOLUMN形式と自動圧縮を持つそれ自体のパーティション内に存在します。ただし、ユーザー指定のROW形式を持ち自動圧縮のないそれ自体のパーティション内に存在するo_commentを除きます。2バイト パーティションが定義されています。行ヘッダー圧縮と自動圧縮によって、テーブルのサイズが削減されます。この例では、自動圧縮が列パーティションのデフォルトとして想定されています。

CREATE TABLE Orders (
    o_orderkey INTEGER NOT NULL,
    o_custkey INTEGER,
    o_orderstatus CHAR(1) CASESPECIFIC,
    o_totalprice DECIMAL(13,2) NOT NULL,
    o_orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL,
    o_shippriority INTEGER,
    ROW(o_comment VARCHAR(79)) NO AUTO COMPRESS )
  PRIMARY AMP (o_orderkey) PARTITION BY COLUMN,
  UNIQUE INDEX (o_orderkey);

例: 列パーティションとUSIを持つ基本AMPインデックス(代替の構文1)

この例では、前の例と同じテーブルを、異なる構文を使用して定義しています。この例では、自動圧縮が列パーティションのデフォルトとして想定されています。

CREATE TABLE Orders (
    o_orderkey INTEGER NOT NULL,
    o_custkey INTEGER,
    o_orderstatus CHAR(1) CASESPECIFIC,
    o_totalprice DECIMAL(13,2) NOT NULL,
    o_orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL,
    o_shippriority INTEGER,
    o_comment VARCHAR(79) )
  PRIMARY AMP INDEX (o_orderkey)
  PARTITION BY COLUMN ALL BUT (ROW(o_comment) NO AUTO COMPRESS),
  UNIQUE INDEX (o_orderkey);

例: 列パーティションとUSIを持つ基本AMPインデックス(代替の構文2)

この例では、前の例と同じテーブルを、異なる構文を使用して定義しています。グループ化句にリストされていない列は、デフォルトで列パーティションにまとめてグループ化されますが、o_shippriorityがCOLUMNグループ化句にリストされていない唯一の列のため、前の例と同様に各列はそれ自体の単一列パーティション内に存在することに注意してください。

CREATE TABLE Orders (
    o_orderkey INTEGER NOT NULL,
    o_custkey INTEGER,
    o_orderstatus CHAR(1) CASESPECIFIC,
    o_totalprice DECIMAL(13,2) NOT NULL,
    o_orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL,
    o_shippriority INTEGER,
    o_comment VARCHAR(79) )
  PRIMARY AMP (o_orderkey)
  PARTITION BY COLUMN (
      o_orderkey, o_custkey, o_orderstatus, o_totalprice,
      o_orderdate, ROW o_comment NO AUTO COMPRESS ),
  UNIQUE INDEX (o_orderkey);