全部产品
Search
文档中心

PolarDB:Penulisan ulang SQL dan penurunan

更新时间:Jul 02, 2025

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 WHERE atau HAVING
  • Komputasi, seperti COUNT dan GROUP BY
  • Pengurutan, seperti ORDER BY
  • Menghapus duplikat, seperti DISTINCT
  • Komputasi fungsi, seperti fungsi NOW()
  • Subquery
Catatan Anda dapat melihat proses rinci penulisan ulang SQL dengan menggunakan 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.

Project and Filter pushdown

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
Limit and Sort pushdown

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:

Agg pushdown for which the shard key is c_nationkey

Jika kunci shard bukan c_nationkey:

Agg pushdown for which the shard key is not 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.

JOIN pushdown

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 Join atau Anti Join.
  • Setelah itu, jika kondisi yang dijelaskan dalam bagian sebelumnya untuk penurunan JOIN terpenuhi, Semi Join atau Anti Join diturunkan ke LogicalView.
  • Semi Join atau Anti Join yang diturunkan dikembalikan ke subquery.
explain optimizer select * from t1 where id in (select id from t2);
Subquery pushdown