17.10 - 例: SELECTおよびPARTITION - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ操作言語

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

例: 行パーティション テーブルのパーティション ロック

この例では、問合わせはテーブルslppit1から単一パーティションを修飾するパーティション列のWHERE条件で行データを取り出します。全AMPのパーティション ロックはアクセスされる単一パーティションをロックし、プロキシ ロックは全AMPのパーティション範囲ロックの配置をシリアル化します。。

この例のテーブル定義は、以下のとおりです。

  CREATE TABLE HLSDS.SLPPIT1 (PI  INT, PC INT, X INT, Y INT)
    PRIMARY INDEX (PI)
    PARTITION BY (RANGE_N(PC BETWEEN 1 AND 10 EACH 1));

SELECT文のEXPLAINがパーティション ロックを示します。

  Explain SELECT * FROM HLSDS.SLPPIT1 WHERE PC = 5;
  1) First, we lock HLSDS.slppit1 for read on a reserved RowHash in a 
      single partition to  prevent global deadlock.
  2) Next, we lock HLSDS.slppit1 for read on a single partition.
  3) We do an all-AMPs RETRIEVE step from a single partition of HLSDS.slppit1 
      with a condition of ("HLSDS.slppit1.Pc = 5") with a residual condition 
      of ("HLSDS.slppit1.Pc = 5") into Spool 1 (group_amps), which is built 
      locally on the AMPs. The size of Spool 1 is estimated with no confidence 
      to be 1 row (65 bytes). The estimated time for this step is 0.07 seconds.
  4) Finally, we send out an END TRANSACTION step to all AMPs involved in 
      processing the request.

例: 選択リスト中のシステム派生PARTITION列を指定したSELECT文

文の選択リスト中のシステム派生PARTITION列を指定できます。PARTITION列は明確な形式で使用されるので、この例では非修飾PARTITION列を指定します。

     SELECT orders.*, PARTITION
     FROM orders
     WHERE orders.PARTITION = 10
     AND   orders.o_totalprice > 100;

以下の選択リストおよびWHERE句の中のSELECT文では、PARTITIONを修飾する必要があります。なぜなら、以下の例では2つのテーブルが結合されますが、両方のテーブルともWHERE句の中でPARTITION列を指定しているからです。

     SELECT orders.*, lineitem.*, orders.PARTITION
     FROM orders, lineitem
     WHERE orders.PARTITION = 3
     AND   lineitem.PARTITION = 5
     AND   orders.o_orderkey = lineitem.1_orderkey;

選択リスト中でPARTITIONを明示的に指定する必要があります。*のみ指定すると、PARTITION列またはPARTITION#Ln列の情報は返されません。

通常、テーブルは行パーティション テーブルになります。なぜなら、

  • 非パーティション テーブルの場合、PARTITIONは常に0です。
  • 行パーティション化がなく、列パーティション テーブルの場合、PARTITIONは常に1です。

例: 選択リストでPARTITIONが指定されていないのでPARTITION値が返されない

次の例では、PARTITIONがWHERE句で指定されているにもかかわらず、PARTITIONの値が列値の1つとして返されません。その理由は、PARTITIONが問合わせの選択リストで明示的に指定されていないからです。

     SELECT *
     FROM orders
     WHERE orders.PARTITION = 10
     AND   orders.o_totalprice > 19.99;

例: 指定が明確なのでPARTITIONの修飾が不要

この例では、PARTITIONの使用が明確なのでPARTITIONを修飾する必要はありません。

     SELECT orders.*, PARTITION
     FROM orders
     WHERE orders.PARTITION = 10
     AND   orders.o_totalprice > 100;

例: 曖昧さを避けるために必要なPARTITIONの修飾

次の2つの例では、ordersテーブルのPARTITION値とlineitemテーブルのPARTITION値を区別するためにPARTITIONを修飾する必要があります。

     SELECT *
     FROM orders, lineitem
     WHERE orders.PARTITION = 3
     AND   lineitem.PARTITION = 5
     AND   orders.o_orderkey = lineitem.l_orderkey;

     SELECT orders.*, lineitem.*, orders.PARTITION
     FROM orders, lineitem
     WHERE orders.PARTITION = 3
     AND   lineitem.PARTITION = 5
     AND   orders.o_orderkey = lineitem.l_orderkey;

例: テーブルからのすべてのアクティブなパーティションの選択

次の2つの例は、ordersテーブルに挿入された行パーティションのリストを返します(ordersテーブルについて、挿入された行パーティションの最大の組み合わせパーティション番号をそれぞれ999または127と想定します)。

     SELECT DISTINCT PARTITION (FORMAT '999')
     FROM orders
     ORDER BY PARTITION;

     SELECT DISTINCT CAST (PARTITION AS BYTEINT)
     FROM orders
     ORDER BY PARTITION;

例: 集約関数でのPARTITIONの使用

次の例では、挿入された各行パーティションの列数をカウントします。

     SELECT PARTITION, COUNT(*)
     FROM orders
     GROUP BY PARTITION
     ORDER BY PARTITION;