Penurunan merupakan optimisasi penting dalam penulisan ulang SQL. Informasi sharding digunakan untuk mengoptimalkan rencana eksekusi, sehingga operator dapat diturunkan sebanyak mungkin guna mencapai tujuan seperti menyaring data terlebih dahulu, mengurangi jumlah transmisi jaringan, dan mengimplementasikan komputasi paralel.
Informasi latar belakang
Sebagian besar komputasi PolarDB-X 1.0 dapat diturunkan ke lapisan penyimpanan MySQL untuk dieksekusi berdasarkan prinsip dasar pengoptimalan pernyataan SQL dari PolarDB-X 1.0.
Komputasi yang dapat diturunkan meliputi:
- JOIN
- Kondisi filter, seperti kondisi dalam
WHEREatauHAVING - Komputasi, seperti
COUNTdanGROUP BY - Pengurutan, seperti
ORDER BY - Menghapus duplikat, seperti
DISTINCT - Komputasi fungsi, seperti fungsi
NOW() - Subquery
explain optimizer + sql.Penurunan Proyek dan Filter
Dalam proses pembuatan rencana eksekusi untuk pernyataan SQL, operator Filter dan Project secara berturut-turut diturunkan ke operator LogicalView.
Penurunan Filter dan Project dapat memberikan efek seperti menyaring data terlebih dahulu dan mengurangi jumlah transmisi jaringan.
> explain optimizer select c_custkey,c_name from customer where c_custkey = 1;c_custkey: kunci shard dari customer. c_name: nama dari customer.

Penurunan Limit dan Sort
Dalam proses berikut untuk menghasilkan rencana eksekusi untuk pernyataan SQL, operator Sort dan Limit secara berturut-turut diturunkan ke operator LogicalView. Penurunan Sort dan Limit dapat mencapai efek, seperti menyaring data terlebih dahulu, mengurangi jumlah transmisi jaringan, mengimplementasikan eksekusi paralel, dan mengurangi penggunaan memori PolarDB-X 1.0 dari PolarDB-X 1.0.
> explain optimizer select * from customer order by c_custkey limit 10
Penurunan Agg
Dalam proses pembuatan rencana eksekusi untuk pernyataan SQL, operator Agg diturunkan ke operator LogicalView.
Penurunan Agg dapat mencapai beberapa efek, seperti penyaringan data terlebih dahulu, pengurangan jumlah transmisi jaringan, implementasi eksekusi paralel, serta pengurangan penggunaan memori PolarDB-X 1.0 dari PolarDB-X 1.0.
> explain optimizer select count(*) from customer group by c_nationkey;Jika kunci shard adalah c_nationkey:

Jika kunci shard bukan c_nationkey:

Penurunan JOIN
Kondisi berikut harus dipenuhi untuk penurunan JOIN:
- Metode sharding tabel t1 dan t2 konsisten, termasuk kunci sharding database, kunci sharding tabel, fungsi sharding, dan jumlah shardings.
- Kondisi JOIN mencakup hubungan kesetaraan antara kunci shard tabel t1 dan t2.
Selain itu, JOIN antara tabel dan tabel siaran selalu dapat diturunkan.
> explain optimizer select * from t1, t2 where t1.id = t2.id;Dalam proses pembuatan rencana eksekusi untuk pernyataan SQL, operator JOIN diturunkan ke operator LogicalView. Penurunan JOIN dapat membawa komputasi lebih dekat ke penyimpanan dan mempercepat eksekusi paralel.

JoinClustering
Saat operasi JOIN dilakukan pada beberapa tabel, PolarDB-X 1.0 menggunakan teknologi optimasi pengelompokan JOIN untuk mengurutkan ulang operasi JOIN dan menempatkan operasi JOIN yang dapat diturunkan di posisi yang berdekatan. Dengan cara ini, operasi JOIN dapat diturunkan sesuai harapan. Contoh berikut disediakan.
Anggaplah urutan JOIN asli adalah t2, t1, dan l2. Setelah operasi JOIN diurutkan ulang, operasi JOIN pada t2 dan l2 masih dapat diturunkan ke LogicalView.
> explain select t2.id from t2 join t1 on t2.id = t1.id join l2 on t1.id = l2.id;
Project(id="id")
HashJoin(condition="id = id AND id = id0", type="inner")
Gather(concurrent=true)
LogicalView(tables="t2_[0-3],l2_[0-3]", shardCount=4, sql="SELECT `t2`.`id`, `l2`.`id` AS `id0` FROM `t2` AS `t2` INNER JOIN `l2` AS `l2` ON (`t2`.`id` = `l2`.`id`) WHERE (`t2`.`id` = `l2`.`id`)")
Gather(concurrent=true)
LogicalView(tables="t1", shardCount=2, sql="SELECT `id` FROM `t1` AS `t1`")Penurunan Subquery
Dalam proses pembuatan rencana eksekusi untuk pernyataan SQL, subquery diturunkan ke operator LogicalView.
Penurunan subquery dapat membawa komputasi lebih dekat ke penyimpanan dan mempercepat eksekusi paralel.
- Subquery pertama kali dikonversi menjadi
Semi JoinatauAnti Join. - Setelah itu, jika kondisi yang dijelaskan dalam bagian sebelumnya untuk penurunan JOIN terpenuhi,
Semi JoinatauAnti Joinditurunkan keLogicalView. Semi JoinatauAnti Joinyang diturunkan dikembalikan ke subquery.
explain optimizer select * from t1 where id in (select id from t2);