All Products
Search
Document Center

MaxCompute:Evaluasi Efektivitas Pemangkasan Partisi

Last Updated:Aug 22, 2026

Topik ini menjelaskan cara mengevaluasi efektivitas pemangkasan partisi.

Latar Belakang

Di MaxCompute, Anda dapat menetapkan satu atau beberapa bidang sebagai kolom partisi saat membuat tabel partisi. Saat mengkueri data, Anda dapat menentukan nama partisi untuk membaca hanya data di partisi yang sesuai. Pendekatan ini menghindari pemindaian tabel penuh, sehingga meningkatkan efisiensi pemrosesan dan mengurangi biaya.

Pemangkasan partisi menerapkan kondisi filter pada kolom partisi, memungkinkan kueri SQL membaca subset partisi alih-alih melakukan pemindaian tabel penuh. Hal ini menghemat sumber daya dan meningkatkan efisiensi kueri. Namun, kegagalan pemangkasan partisi cukup umum terjadi.

Topik ini mencakup dua aspek pemangkasan partisi:

  • Cara menentukan apakah pemangkasan partisi efektif.

  • Analisis skenario di mana pemangkasan partisi gagal.

Menentukan Apakah Pemangkasan Partisi Efektif

Anda dapat menggunakan perintah EXPLAIN untuk melihat rencana eksekusi SQL dan menentukan apakah pemangkasan partisi efektif.

  • Pemangkasan partisi tidak efektif.

    explain
    select seller_id
    from xxxxx_trd_slr_ord_1d
    where ds=rand();

    Rencana eksekusi menunjukkan bahwa kueri SQL membaca semua 1.344 partisi tabel tersebut.

  • Pemangkasan partisi efektif.

    explain
    select seller_id
    from xxxxx_trd_slr_ord_1d
    where ds='20150801';
    In Task M1 Stg1:
    Data source:rd_slr_ord_id/dtrd_slr_ord_id/ds=20150801
    TS: alias: rd_slr_ord_id/dtrd_slr_ord_id
        FIL: EQUAL(rd_slr_ord_id/dtrd_slr_ord_id.ds, '20150801')
            SEL: rd_slr_ord_id/dtrd_slr_ord_id.seller_id

    Rencana eksekusi menunjukkan bahwa kueri SQL hanya membaca partisi 20150801 dari tabel tersebut.

Skema Kegagalan Pemangkasan Partisi

  • Kegagalan akibat fungsi yang ditentukan pengguna

    Pemangkasan partisi dapat gagal jika kondisi filter pada kolom partisi menggunakan user-defined function (UDF) atau fungsi bawaan tertentu. Oleh karena itu, jika Anda menggunakan fungsi non-standar untuk memfilter nilai partisi, gunakan perintah EXPLAIN untuk melihat rencana eksekusi dan pastikan bahwa pemangkasan partisi efektif.

    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))
    Catatan

    UDF kini mendukung pemangkasan partisi. Untuk informasi selengkapnya, lihat penjelasan dalam Klausa WHERE (WHERE_condition).

  • Kegagalan saat menggunakan JOIN

    Saat Anda menggunakan JOIN dalam pernyataan SQL:

    • Jika kondisi filter partisi berada di klausa WHERE, pemangkasan partisi berlaku.

    • Jika kondisi filter partisi berada di klausa ON, pemangkasan berlaku untuk tabel kanan dalam LEFT JOIN, tetapi tidak berlaku untuk tabel kiri.

    Bagian ini menjelaskan perilaku untuk tiga jenis JOIN:

    • LEFT OUTER JOIN

      • Semua kondisi filter partisi berada di klausa 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';

        Setelah menjalankan pernyataan explain di atas, rencana eksekusi dikembalikan sebagai berikut. Rencana tersebut menunjukkan bahwa sumber data tabel kiri memindai semua 1.770 partisi, dan kondisi filter didorong ke operator FIL:

        In Task M2_Stg1:
          Data source: xxx ller/ds=20101001, xxx seller/ds=20101002, xxx seller/ds=20101003...(total 1770)
          xxx
              RS: order: +
                  optimizeOrderBy: False
                valueDestLimit: 0
                keys:
                     b.user_id
                values:
                     b.ds
                partitions
                  b.user_id
        In Task J3_1_2_Stg1:
            JOIN: a LEFT OUTER JOIN b
              filter:
                  0:
                  1:
              FIL: And(EQUAL(a. col96, '20150801'), EQUAL(b. col209, '20150801'))
            SEL: xxx
              FS: output: None

        Output di atas menunjukkan bahwa pemindaian tabel penuh dilakukan pada tabel kiri, sedangkan pemangkasan partisi efektif untuk tabel kanan.

      • Semua kondisi filter partisi berada di klausa 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';
        Task M2_Stg1:
          Data source: xxx/ds=seller/ds=20150801
          TS: alias: b
              FIL: EQUAL(b.ds, '20150801')
                  RS: order: +
                      optimizeOrderBy: False
                      valueDestLimit: 0
                      keys:
                          b.user_id
                      values:
                      partitions:
                          b.user_id
        In Task J3_1_2_Stg1:
          JOIN: a LEFT OUTER JOIN unknown
              filter:
                  0:
                  1:
              SEL: a._col0, a._col20
              FS: output: None
        In Task M1_Stg1:
          Data source: xxx/ds= trd slr ord 1d/ds=20150801
          TS: alias: a

        Rencana eksekusi menunjukkan bahwa pemangkasan partisi efektif untuk kedua tabel.

    • RIGHT OUTER JOIN

      Seperti halnya LEFT OUTER JOIN, jika kondisi filter partisi berada di klausa ON pada RIGHT OUTER JOIN, pemangkasan partisi hanya efektif untuk tabel kiri. Jika kondisi tersebut berada di klausa WHERE, pemangkasan partisi efektif untuk kedua tabel.

    • FULL OUTER JOIN

      Untuk FULL OUTER JOIN, kondisi filter partisi hanya efektif jika berada di klausa WHERE. Jika berada di klausa ON, pemangkasan partisi tidak efektif untuk kedua tabel.

Peringatan

  • Kegagalan pemangkasan partisi dapat berdampak signifikan dan sering kali sulit dideteksi. Oleh karena itu, periksa kegagalan tersebut sebelum meng-commit kode Anda.

  • Untuk menggunakan pemangkasan partisi dengan user-defined function, Anda harus memodifikasi kelas atau menambahkan set odps.sql.udf.ppr.deterministic = true; sebelum pernyataan SQL Anda. Untuk informasi selengkapnya, lihat Klausa WHERE (WHERE_condition).