すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:パーティションプルーニングが有効かどうかを確認する

最終更新日:Jan 17, 2025

このトピックでは、パーティションプルーニングが有効かどうかを確認する方法について説明します。

背景情報

MaxComputeパーティションテーブルは、パーティションを持つテーブルです。 パーティションキーとして1つ以上の列を指定して、パーティションテーブルを作成できます。 アクセスするパーティションの名前を指定した場合、MaxComputeはそのパーティションからのみデータを読み取り、テーブル全体をスキャンしません。 これにより、コストが削減され、効率が向上します。

パーティションプルーニングでは、パーティションキー列のフィルタ条件を指定できます。 このように、MaxComputeは、SQL文で指定したフィルター条件を満たすパーティションからのみデータを読み取ります。 これにより、テーブル全体のスキャンに起因するエラーやリソースの浪費が回避されます。 ただし、パーティションプルーニングは有効にならない場合があります。

このトピックでは、次の側面からパーティションプルーニングについて説明します。
  • パーティションプルーニングが有効かどうかを確認する
  • パーティションプルーニングが有効にならないシナリオ

パーティションプルーニングが有効かどうかを確認する

パーティションプルーニングがクエリに対して有効かどうかを確認するには、EXPLAINステートメントを実行して、クエリの実行プランを表示します。
  • パーティションプルーニングが有効にならないクエリの場合:
    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';
    Partition pruning

    実行プランは、テーブル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';
        &&

        実行計画は、パーティションプルーニングが両方のテーブルに対して有効であることを示します。

    • 右外側の参加

      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) 」をご参照ください。