Topik ini menjelaskan cara menyesuaikan urutan join secara manual setelah menggunakan hint untuk menonaktifkan fitur penyesuaian otomatis urutan join.
Ikhtisar
AnalyticDB for MySQL mendukung kueri yang berisi join kompleks dan menyediakan fitur penyesuaian otomatis urutan join. Namun, kondisi filter dari pernyataan kueri dan tabel dapat berubah sewaktu-waktu. Jika karakteristik data kompleks, fitur penyesuaian otomatis urutan join mungkin gagal memperkirakan karakteristik kueri dalam semua skenario atau memilih urutan join yang optimal. Urutan join yang tidak sesuai dapat menyebabkan masalah yang memengaruhi kinerja kueri, seperti ekspansi data dalam set hasil sementara dan penggunaan memori yang tinggi.
Untuk mengatasi masalah tersebut, AnalyticDB for MySQL memungkinkan Anda menggunakan hint /*+ reorder_joins*/ untuk menentukan apakah akan mengaktifkan fitur penyesuaian otomatis urutan join.
/*+ reorder_joins=true*/: Mengaktifkan fitur penyesuaian otomatis urutan join. Setelah diaktifkan, sistem secara otomatis menyesuaikan urutan join. Secara default, fitur ini diaktifkan di AnalyticDB for MySQL. Saat menjalankan kueri SQL, urutan join disesuaikan secara otomatis tanpa perlu menggunakan hint./*+ reorder_joins=false*/: Menonaktifkan fitur penyesuaian otomatis urutan join. Setelah dinonaktifkan, Anda dapat menyesuaikan urutan join secara manual berdasarkan karakteristik data dari kueri. Ini memungkinkan Anda menjalankan kueri berdasarkan urutan join dalam pernyataan SQL yang ditulis.
/*+ reorder_joins*/ adalah hint tingkat sesi yang hanya berlaku pada pernyataan SQL tempat hint tersebut diterapkan.
Metode penyesuaian
Sebelum Penyesuaian
Pernyataan Kueri
Contoh berikut menunjukkan pernyataan Query 10 asli.
CatatanContoh ini menjelaskan cara menyesuaikan urutan join secara manual dan menunjukkan efek kueri. Dalam contoh ini, Query 10 dalam benchmark TPC-H digunakan. Untuk informasi tentang benchmark TPC-H, lihat TPC-H Versi 2 dan Versi 3.
Secara default, fitur penyesuaian otomatis urutan join diaktifkan di AnalyticDB for MySQL. Saat pernyataan kueri berikut dijalankan, hint
/*+ reorder_joins=false*/digunakan untuk mensimulasikan skenario di mana urutan join tidak sesuai.
SELECT c_custkey, c_name, Sum(l_extendedprice * (1 - l_discount)) AS revenue, c_acctbal, n_name, c_address, c_phone, c_comment FROM customer c, orders o, lineitem l, nation n WHERE c_custkey = o_custkey AND l_orderkey = o_orderkey AND o_orderdate >= date '1993-10-01' AND o_orderdate < date '1993-10-01' + INTERVAL '3' month AND l_returnflag = 'R' AND c_nationkey = n_nationkey GROUP BY c_custkey, c_name, c_acctbal, c_phone, n_name, c_address, c_comment ORDER BY revenue DESC LIMIT 20;Urutan Join
Tabel digabungkan dalam urutan berikut berdasarkan pernyataan SQL di atas:
customer JOIN orders JOIN lineitem JOIN nation;Hasil Kueri
Hasil sementara berikut dari setiap join dalam rencana eksekusi dikembalikan.
CatatanUntuk informasi tentang cara menanyakan rencana eksekusi, lihat Gunakan Rencana Eksekusi untuk Menganalisis Kueri.
Setelah tabel
customerdanordersdigabungkan, 57.069 baris dikembalikan dalam set hasil sementaratmp1.
Setelah set hasil sementara
tmp1dan tabellineitemdigabungkan, 114.705 baris dikembalikan dalam set hasil sementaratmp2.
Setelah set hasil sementara
tmp2dan tabelnationdigabungkan, 114.705 baris dikembalikan sebagai hasil akhir.
Jumlah total baris yang dikembalikan dari ketiga join dihitung dengan menggunakan rumus berikut: 57.069 + 114.705 + 114.705 = 286.479.
Setelah Penyesuaian
Pernyataan Kueri
Tambahkan hint
/*+ reorder_joins=false*/ke pernyataan SQL untuk menonaktifkan fitur penyesuaian otomatis urutan join AnalyticDB for MySQL, dan sesuaikan urutan join secara manual. Contoh berikut menunjukkan pernyataan SQL yang telah disesuaikan:/*reorder_joins=false*/ SELECT c_custkey, c_name, Sum(l_extendedprice * (1 - l_discount)) AS revenue, c_acctbal, n_name, c_address, c_phone, c_comment FROM customer c, orders o, nation n, lineitem l WHERE c_custkey = o_custkey AND c_nationkey = n_nationkey AND l_orderkey = o_orderkey AND o_orderdate >= date '1993-10-01' AND o_orderdate < date '1993-10-01' + INTERVAL '3' month AND l_returnflag = 'R' GROUP BY c_custkey, c_name, c_acctbal, c_phone, n_name, c_address, c_comment ORDER BY revenue DESC LIMIT 20;Urutan Join
Tabel digabungkan dalam urutan berikut berdasarkan pernyataan SQL di atas:
customer JOIN orders JOIN nation JOIN lineitemHasil Kueri
Hasil sementara berikut dari setiap join dalam rencana eksekusi dikembalikan.
CatatanUntuk informasi tentang cara menanyakan rencana eksekusi, lihat Gunakan Rencana Eksekusi untuk Menganalisis Kueri.
Setelah tabel
customerdanordersdigabungkan, 57.069 baris dikembalikan dalam set hasil sementaratmp1.
Setelah set hasil sementara
tmp1dan tabelnationdigabungkan, 57.069 baris dikembalikan dalam set hasil sementaratmp2.
Setelah set hasil sementara
tmp2dan tabellineitemdigabungkan, 114.705 baris dikembalikan sebagai hasil akhir.
Jumlah total baris yang dikembalikan dari ketiga join dihitung dengan menggunakan rumus berikut: 57.069 + 57.069 + 114.705 = 228.843.
Jumlah total baris yang dikembalikan setelah penyesuaian berkurang sebesar 20%. Perbandingan di atas menunjukkan bahwa urutan join yang berbeda memengaruhi ukuran set hasil sementara antara. Jika urutan join di AnalyticDB for MySQL tidak sesuai, Anda dapat menyesuaikan urutan join secara manual untuk meningkatkan kinerja kueri.