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_idRencana 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))CatatanUDF 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
explaindi 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: NoneOutput 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: aRencana 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).