例: 行パーティション テーブルのパーティション ロック
この例では、問合わせはテーブル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;