Topik ini menjelaskan cara memeriksa apakah pemangkasan partisi efektif.
Informasi latar belakang
Tabel partisi MaxCompute adalah tabel dengan partisi. Anda dapat menentukan satu atau lebih kolom sebagai kunci partisi untuk membuat tabel partisi. Jika Anda telah menentukan nama partisi yang ingin diakses, MaxCompute hanya membaca data dari partisi tersebut dan tidak memindai seluruh tabel. Hal ini mengurangi biaya serta meningkatkan efisiensi.
Pemangkasan partisi memungkinkan Anda menentukan kondisi filter untuk kolom kunci partisi. Dengan cara ini, MaxCompute hanya membaca data dari partisi yang memenuhi kondisi filter yang telah Anda tentukan dalam pernyataan SQL. Ini menghindari kesalahan dan pemborosan sumber daya yang disebabkan oleh pemindaian tabel penuh. Namun, pemangkasan partisi mungkin tidak berlaku dalam beberapa kasus.
- Periksa apakah pemangkasan partisi efektif
- Skenario di mana pemangkasan partisi tidak berlaku
Periksa apakah pemangkasan partisi efektif
- Untuk kueri di mana pemangkasan partisi tidak berlaku:
explain select seller_id from xxxxx_trd_slr_ord_1d where ds=rand();Rencana eksekusi menunjukkan bahwa semua 1.344 partisi Tabel xxxxx_trd_slr_ord_1d dibaca.
- Untuk kueri di mana pemangkasan partisi efektif:
explain select seller_id from xxxxx_trd_slr_ord_1d where ds='20150801';
Rencana eksekusi menunjukkan bahwa hanya Partisi 20150801 dari Tabel xxxxx_trd_slr_ord_1d yang dibaca.
Skenario di mana pemangkasan partisi tidak berlaku
- Penggunaan UDF yang Tidak Tepat Jika Anda menggunakan fungsi yang ditentukan pengguna (UDF) atau fungsi bawaan tertentu untuk menentukan partisi, pemangkasan partisi mungkin tidak berlaku. Dalam hal ini, kami sarankan Anda menjalankan pernyataan EXPLAIN untuk memeriksa apakah 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))null Untuk informasi lebih lanjut tentang pemangkasan partisi berbasis UDF, lihat bagian "WHERE" di Klausa WHERE (WHERE_condition). - Penggunaan JOIN yang Tidak Tepat Saat Anda menggabungkan tabel, perhatikan aturan berikut:
- Jika kondisi pemangkasan partisi ditentukan dalam klausa WHERE, pemangkasan partisi efektif.
- Jika kondisi pemangkasan partisi ditentukan dalam klausa ON, pemangkasan partisi efektif untuk tabel sekunder, tetapi tidak untuk tabel utama.
Contoh berikut menjelaskan cara kerja pemangkasan partisi saat tiga jenis operasi JOIN yang berbeda dilakukan:- LEFT OUTER JOIN
- Untuk kueri di mana kondisi pemangkasan partisi ditentukan dalam 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';
Rencana eksekusi menunjukkan bahwa pemangkasan partisi efektif untuk tabel kanan, tetapi tidak untuk tabel kiri.
- Untuk kueri di mana kondisi pemangkasan partisi ditentukan dalam 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';
Rencana eksekusi menunjukkan bahwa pemangkasan partisi efektif untuk kedua tabel.
- Untuk kueri di mana kondisi pemangkasan partisi ditentukan dalam klausa ON:
- RIGHT OUTER JOIN
Operasi RIGHT OUTER JOIN mirip dengan operasi LEFT OUTER JOIN. Jika kondisi pemangkasan partisi ditentukan dalam klausa ON, pemangkasan partisi efektif hanya untuk tabel kiri, tetapi tidak untuk tabel kanan. Jika kondisi pemangkasan partisi ditentukan dalam klausa WHERE, pemangkasan partisi efektif untuk kedua tabel.
- FULL OUTER JOIN
Pemangkasan partisi efektif hanya ketika kondisi pemangkasan partisi ditentukan dalam klausa WHERE, tetapi tidak dalam klausa ON.
Dampak dan pertimbangan
- Jika pemangkasan partisi tidak berlaku, kinerja kueri dapat sangat menurun. Masalah ini sulit ditemukan. Kami sarankan Anda memeriksa apakah pemangkasan partisi efektif sebelum mengirim kode.
- Untuk menggunakan UDF untuk pemangkasan partisi, Anda harus memodifikasi kelas UDF atau menambahkan
set odps.sql.udf.ppr.deterministic = true;sebelum pernyataan SQL untuk dieksekusi. Untuk informasi lebih lanjut, lihat Klausa WHERE (WHERE_condition).