このトピックでは、パーティションプルーニングが有効かどうかを確認する方法について説明します。
背景情報
MaxComputeパーティションテーブルは、パーティションを持つテーブルです。 パーティションキーとして1つ以上の列を指定して、パーティションテーブルを作成できます。 アクセスするパーティションの名前を指定した場合、MaxComputeはそのパーティションからのみデータを読み取り、テーブル全体をスキャンしません。 これにより、コストが削減され、効率が向上します。
パーティションプルーニングでは、パーティションキー列のフィルタ条件を指定できます。 このように、MaxComputeは、SQL文で指定したフィルター条件を満たすパーティションからのみデータを読み取ります。 これにより、テーブル全体のスキャンに起因するエラーやリソースの浪費が回避されます。 ただし、パーティションプルーニングは有効にならない場合があります。
- パーティションプルーニングが有効かどうかを確認する
- パーティションプルーニングが有効にならないシナリオ
パーティションプルーニングが有効かどうかを確認する
- パーティションプルーニングが有効にならないクエリの場合:
explain select seller_id from xxxxx_trd_slr_ord_1d where ds=rand();実行プランは、テーブルxxxxx_trd_slr_ord_1dのすべての1,344パーティションが読み取られることを示します。
- パーティションプルーニングが有効なクエリの場合:
explain select seller_id from xxxxx_trd_slr_ord_1d where ds='20150801';
実行プランは、テーブルxxxxx_trd_slr_ord_1dのパーティション20150801のみが読み取られることを示します。
パーティションプルーニングが有効にならないシナリオ
- UDFの不適切な使用 ユーザー定義関数 (UDF) または特定の組み込み関数を使用してパーティションを指定すると、パーティションプルーニングが有効にならない場合があります。 この場合、EXPLAINステートメントを実行して、パーティションプルーニングが有効かどうかを確認することをお勧めします。
explain select ... from xxxxx_base2_brd_ind_cw where ds = concat(SPLIT_PART(bi_week_dim(' ${bdp.system.bizdate}'), ',', 1), SPLIT_PART(bi_week_dim(' ${bdp.system.bizdate}'), ',', 2))説明 UDFベースのパーティションプルーニングの詳細については、「WHERE句 (where_condition) 」の「WHERE」セクションをご参照ください。 - 結合の不適切な使用 テーブルに参加するときは、次のルールに注意してください。
- WHERE句でパーティションプルーニング条件が指定されている場合、パーティションプルーニングは有効です。
- ON句でパーティションプルーニング条件が指定されている場合、パーティションプルーニングはセカンダリテーブルでは有効ですが、プライマリテーブルでは有効ではありません。
次の例では、3つの異なるタイプのJOIN操作が実行されたときのパーティションプルーニングの動作について説明します。- 左外側の参加
- パーティション剪定条件がON句で指定されているクエリの場合:
set odps.sql.allow.fullscan=true; explain select a.seller_id ,a.pay_ord_pbt_1d_001 from xxxxx_trd_slr_ord_1d a left outer join xxxxx_seller b on a.seller_id=b.user_id and a.ds='20150801' and b.ds='20150801';
実行計画は、パーティションプルーニングが右側のテーブルには有効であるが、左側のテーブルには有効ではないことを示しています。
- パーティション剪定条件がwhere句で指定されているクエリの場合:
set odps.sql.allow.fullscan=true; explain select a.seller_id ,a.pay_ord_pbt_1d_001 from xxxxx_trd_slr_ord_1d a left outer join xxxxx_seller b on a.seller_id=b.user_id where a.ds='20150801' and b.ds='20150801';
実行計画は、パーティションプルーニングが両方のテーブルに対して有効であることを示します。
- パーティション剪定条件がON句で指定されているクエリの場合:
- 右外側の参加
RIGHT OUTER JOINオペレーションは、LEFT OUTER JOINオペレーションと同様である。 ON句でパーティションプルーニング条件を指定した場合、パーティションプルーニングは左側のテーブルに対してのみ有効で、右側のテーブルに対しては有効ではありません。 WHERE句でパーティションプルーニング条件が指定されている場合、パーティションプルーニングは両方のテーブルに対して有効です。
- FULL OUTER JOIN
パーティションプルーニングは、パーティションプルーニング条件がWHERE句で指定され、ON句では指定されていない場合にのみ有効です。
影響と考慮事項
- パーティションプルーニングが有効にならない場合、クエリのパフォーマンスが大幅に低下する可能性があります。 この問題はほとんど発見できません。 コードをコミットする前に、パーティションプルーニングが有効かどうかを確認することをお勧めします。
- パーティションプルーニングにUDFを使用するには、UDFのクラスを変更するか、SQLステートメントを実行する前に
set odps.sql.udf.ppr.de terministic = true;を追加する必要があります。 詳細については、「WHERE句 (where_condition) 」をご参照ください。