Jika Anda ingin menggabungkan tabel besar dengan beberapa tabel kecil, Anda dapat secara eksplisit menentukan petunjuk MAPJOIN dalam pernyataan SELECT untuk meningkatkan kinerja query. Topik ini menjelaskan penggunaan petunjuk MAPJOIN untuk menggabungkan tabel.
Deskripsi
Operasi JOIN terdiri dari tiga tahap: map, shuffle, dan reduce. Dalam banyak kasus, tabel digabungkan pada tahap reduce.
MAPJOIN menggabungkan tabel pada tahap map alih-alih tahap reduce. Hal ini mempercepat transmisi data, mengurangi konsumsi sumber daya sistem, dan mengoptimalkan kinerja pekerjaan.
Pada tahap map, MAPJOIN memuat seluruh data dari tabel kecil yang ditentukan ke dalam memori program yang menjalankan operasi JOIN, sehingga meningkatkan efisiensi operasi JOIN.
Dalam MaxCompute SQL, Anda tidak dapat menggunakan joins non-equi atau logika OR dalam kondisi ON. Namun, hal ini dapat dilakukan dalam MAPJOIN.
Batasan
Berikut adalah batasan penggunaan MAPJOIN:
Pada tahap map,
MAPJOINmemuat semua data dari tabel yang ditentukan ke dalam memori program yang melakukan operasi JOIN. Tabel yang ditentukan untuk MAPJOIN harus berupa tabel kecil, dan total memori yang digunakan oleh data tabel tidak boleh melebihi 512 MB. MaxCompute mengompresi data sebelum penyimpanan. Setelah tabel kecil dimuat ke dalam memori, volume data tabel meningkat tajam. 512 MB menunjukkan jumlah data maksimum setelah tabel kecil dimuat ke dalam memori.Catatan512 MB di sini merujuk pada ukuran memori maksimum yang ditempati oleh tabel kecil setelah dimuat ke dalam memori dan didekompresi, bukan ukuran file tabel kecil setelah dikompresi dan disimpan di MaxCompute.
Batasan operasi
JOINdalamMAPJOIN:Tabel kiri dalam operasi
LEFT OUTER JOINharus berupa tabel besar.Tabel kanan dalam operasi
RIGHT OUTER JOINharus berupa tabel besar.MAPJOIN tidak dapat digunakan dalam operasi
FULL OUTER JOIN.Tabel kiri atau kanan dalam operasi
INNER JOINbisa berupa tabel besar.
MaxCompute memungkinkan Anda menentukan maksimal 128 tabel kecil untuk
MAPJOIN. Jika Anda menentukan lebih dari 128 tabel kecil, kesalahan sintaks akan dikembalikan.
Catatan Penggunaan
Anda hanya dapat menjalankan MAPJOIN setelah menambahkan petunjuk /*+ mapjoin(<table_name>) */ ke dalam pernyataan SELECT. Perhatikan hal-hal berikut:
Saat merujuk ke tabel kecil atau subquery, Anda harus merujuk alias tabel atau subquery tersebut.
Dalam MAPJOIN, Anda dapat menggunakan subquery sebagai tabel kecil.Dalam
MAPJOIN, Anda dapat menggunakan joins non-equi atau menggabungkan kondisi dengan menggunakanOR. Anda juga dapat menghitung Produk Kartesius dengan menggunakanMAPJOIN ON 1 = 1tanpa menentukan kondisiON, sepertiselect /*+ mapjoin(a) */ a.id from shop a join table_name b on 1=1;. Namun, metode perhitungan ini dapat meningkatkan volume data.Pisahkan beberapa tabel kecil dalam
MAPJOINdengan koma (,), seperti/*+ mapjoin(a,b,c)*/.
Beberapa subquery seperti SCALAR, IN, NOT IN, EXISTS, dan NOT EXISTS dapat diubah menjadi operasi JOIN selama eksekusi. MAPJOIN adalah algoritma JOIN yang efisien. Jika hasil SUBQUERY adalah tabel kecil, Anda dapat menggunakan HINT dalam pernyataan subquery untuk secara eksplisit menentukan algoritma MAPJOIN.
Data Contoh
Data contoh sumber disediakan untuk membantu Anda lebih memahami contoh dalam topik ini. Dalam contoh ini, tabel sale_detail dan sale_detail_sj dibuat, dan data dimasukkan ke dalam tabel.
-- Buat tabel partisi bernama sale_detail.
create table if not exists sale_detail
(
shop_name string,
customer_id string,
total_price double
)
partitioned by (sale_date string, region string);
create table if not exists sale_detail_sj
(
shop_name string,
customer_id string,
total_price double
)
partitioned by (sale_date string, region string);
-- Tambahkan partisi ke tabel sale_detail dan sale_detail_sj.
alter table sale_detail add partition (sale_date='2013', region='china');
alter table sale_detail_sj add partition (sale_date='2013', region='china');
-- Masukkan data ke dalam tabel sale_detail dan sale_detail_sj.
insert into sale_detail partition (sale_date='2013', region='china') values ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3);
insert into sale_detail_sj partition (sale_date='2013', region='china') values ('s1','c1',100.1),('s2','c2',100.2),('s5','c2',100.2),('s2','c2',100.2);Contoh
Lakukan operasi JOIN pada tabel sale_detail dan sale_detail_sj. Operasi harus memenuhi salah satu dari kondisi berikut: 1. Total nilai kolom total_price dalam tabel sale_detail_sj kurang dari total nilai kolom total_price dalam tabel sale_detail. 2. Jumlah nilai kolom total_price dalam tabel sale_detail_sj dan nilai kolom total_price dalam tabel sale_detail kurang dari 500. Contoh pernyataan:
-- Izinkan pemindaian penuh pada tabel partisi.
SET odps.sql.allow.fullscan=true;
-- Gunakan MAPJOIN untuk melakukan query.
select /*+ mapjoin(a) */
a.shop_name,
a.total_price,
b.total_price
from sale_detail_sj a join sale_detail b
on a.total_price < b.total_price or a.total_price + b.total_price < 500;Hasil berikut dikembalikan:
+-----------+-------------+--------------+
| shop_name | total_price | total_price2 |
+-----------+-------------+--------------+
| s1 | 100.1 | 100.1 |
| s2 | 100.2 | 100.1 |
| s5 | 100.2 | 100.1 |
| s2 | 100.2 | 100.1 |
| s1 | 100.1 | 100.2 |
| s2 | 100.2 | 100.2 |
| s5 | 100.2 | 100.2 |
| s2 | 100.2 | 100.2 |
| s1 | 100.1 | 100.3 |
| s2 | 100.2 | 100.3 |
| s5 | 100.2 | 100.3 |
| s2 | 100.2 | 100.3 |
+-----------+-------------+--------------+