All Products
Search
Document Center

PolarDB:Operator

Last Updated:Sep 22, 2026

Topik ini menjelaskan operator umum dalam rencana eksekusi beserta fungsinya masing-masing.

Referensi operator

Kategori Operator
Push down ke node data LogicalView, LogicalModifyView, PhyTableOperation, IndexScan
Join BKAJoin, NLJoin, HashJoin, SortMergeJoin, HashSemiJoin, SortMergeSemiJoin, MaterializedSemiJoin
Sort MemSort, TopN, MergeSort
Agregasi (GROUP BY) HashAgg, SortAgg
Redistribusi atau pengumpulan data Exchange, Gather
Filter Filter
Project Project
Gabungkan set hasil UnionAll, UnionDistinct
Batasi jumlah baris output (Limit/Offset...Fetch) Limit
Fungsi window OverWindow

Operator yang melakukan push down ke node data

LogicalView

LogicalView membaca data dari sumber data MySQL di lapisan penyimpanan. Operator ini mirip dengan TableScan atau IndexScan pada database lain, tetapi mendukung kumpulan operasi pushdown yang lebih luas. LogicalView berisi pernyataan SQL yang dipush-down dan informasi sumber data, serta berperilaku seperti view. SQL yang dipush-down dapat mencakup operasi Project, Filter, agregasi, sort, Join, dan subkueri. Contoh berikut menunjukkan output LogicalView dan menjelaskan setiap bidang:

explain select * From sbtest1 where id > 1000;

Output:

Gather(concurrent=true)
   LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` WHERE (`id` > ?)")
LogicalView terdiri dari tiga bagian:
  • tables: nama tabel di sumber data MySQL lapisan penyimpanan, dipisahkan oleh titik.. Bagian sebelum titik. adalah nomor shard database, sedangkan bagian setelahnya adalah nama tabel beserta nomor shard-nya. Misalnya, [000-127] merepresentasikan semua tabel dengan nomor shard dari 000 hingga 127.
  • shardCount: jumlah total shard tabel yang diakses. Pada contoh ini, 128 shard tabel dari 000 hingga 127 diakses.
  • sql: templat SQL yang dikirim ke sumber data MySQL lapisan penyimpanan. PolarDB-X Saat waktu proses, nama tabel diganti dengan nama tabel fisik, dan placeholder parameter konstan? diganti dengan nilai parameter aktual. Untuk informasi selengkapnya, lihat Manajemen rencana eksekusi.

LogicalModifyView

LogicalModifyView memodifikasi data di sumber data dasar. Operator ini juga mencatat pernyataan SQL, yang dapat berupa INSERT, UPDATE, atau DELETE. Contoh berikut menunjukkan output LogicalModifyView dan menjelaskan setiap bidang:
  • Contoh 1
    explain update sbtest1 set c='Hello, DRDS' where id > 1000;

    Output:

    LogicalModifyView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="UPDATE `sbtest1` SET `c` = ? WHERE (`id` > ?)"
  • Contoh 2
    explain delete from sbtest1 where id > 1000;

    Output:

    LogicalModifyView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="DELETE FROM `sbtest1` WHERE (`id` > ?)")
Bidang-bidang dalam rencana kueri LogicalModifyView mirip dengan LogicalView, termasuk shard tabel fisik, jumlah shard, dan templat SQL. Demikian pula, karena cache rencana eksekusi diaktifkan, SQL diparameterisasi dan konstanta dalam templat SQL diganti dengan?.

PhyTableOperation

PhyTableOperation melakukan operasi langsung pada satu shard tabel fisik.

Catatan Umumnya, operator ini hanya digunakan untuk pernyataan INSERT. Namun, ketika kueri diarahkan ke satu shard saja, operator ini juga dapat muncul dalam pernyataan SELECT.
explain insert into sbtest1 values(1, 1, '1', '1'),(2, 2, '2', '2');

Output:

PhyTableOperation(tables="SYSBENCH_CORONADB_1526954857179TGMMSYSBENCH_CORONADB_VGOC_0000_RDS.[sbtest1_001]", sql="INSERT INTO ? (`id`, `k`, `c`, `pad`) VALUES(?, ?, ?, ?)", params="`sbtest1_001`,1,1,1,1")
PhyTableOperation(tables="SYSBENCH_CORONADB_1526954857179TGMMSYSBENCH_CORONADB_VGOC_0000_RDS.[sbtest1_002]", sql="INSERT INTO ? (`id`, `k`, `c`, `pad`) VALUES(?, ?, ?, ?)", params="`sbtest1_002`,2,2,2,2")
Pada contoh ini, pernyataan INSERT memasukkan dua baris, dan setiap baris berkorespondensi dengan satu operator PhyTableOperation. PhyTableOperation terdiri dari tiga bagian:
  • tables: nama tabel fisik. Setiap PhyTableOperation menargetkan tepat satu tabel fisik.
  • sql: templat SQL, di mana nama tabel dan konstanta diparameterisasi dan diganti dengan?. Nilai parameter yang sesuai disediakan dalam bidang params berikutnya.
  • params: nilai parameter untuk templat SQL, termasuk nama tabel dan konstanta.

IndexScan

IndexScan membaca data dari sumber data MySQL lapisan penyimpanan dengan memindai tabel indeks, mirip dengan LogicalView. Contoh berikut menunjukkan output IndexScan dan menjelaskan setiap bidang:

explain select * from sequence_one_base where integer_test=1;

Output:

+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| IndexScan(tables="DRDS_POLARX1_QATEST_APP_000000_GROUP.gsi_sequence_one_index_3a0A_01", sql="SELECT `pk`, `integer_test`, `varchar_test`, `char_test`, `blob_test`, `tinyint_test`, `tinyint_1bit_test`, `smallint_test`, `mediumint_test`, `bit_test`, `bigint_test`, `float_test`, `double_test`, `decimal_test`, `date_test`, `time_test`, `datetime_test`, `timestamp_test`, `year_test`, `mediumtext_test` FROM `gsi_dml_sequence_one_index_index1` AS `gsi_dml_sequence_one_index_index1` WHERE (`integer_test` = ?)") |
Pernyataan SQL di atas biasanya akan memindai tabel sequence_one_base. Karena integer_test bukan kunci partisi, pemindaian semua shard sequence_one_base diperlukan. Namun, karena tabel sequence_one_base memiliki global secondary index (GSI) bernama gsi_sequence_one_index pada kolom integer_test, predikat integer_test=1 digunakan untuk memangkas tabel indeks. Akibatnya, operator IndexScan dihasilkan, yang hanya memindai satu shard dari tabel gsi_sequence_one_index.

Operator yang dijalankan pada node komputasi atau node data

UnionAll dan UnionDistinct

UnionAll berkorespondensi dengan UNION ALL, dan UnionDistinct berkorespondensi dengan UNION DISTINCT. Operator ini biasanya memiliki dua atau lebih input dan menggabungkan data dari beberapa input menjadi satu. Contoh:

explain select * From sbtest1 where id > 1000 union distinct select * From sbtest1 where id < 200;

Output:

UnionDistinct(concurrent=true)
  Gather(concurrent=true)
    LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` WHERE (`id` > ?)")
  Gather(concurrent=true)
    LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` WHERE (`id` < ?)")

Gather

Gather menggabungkan beberapa aliran data menjadi satu aliran data tunggal. Pada contoh sebelumnya, Gather menggabungkan data yang dikumpulkan dari setiap shard tabel menjadi satu set hasil. Gather biasanya muncul di atas LogicalView dan mengumpulkan data dari semua shard yang dipindai.

Exchange

Exchange adalah operator logika yang tidak melakukan komputasi apa pun terhadap data. Operator ini mendistribusikan ulang data input dan meneruskannya ke operator downstream. Strategi redistribusi umum meliputi:
  • SINGLETON: menggabungkan beberapa aliran data upstream menjadi satu aliran output. Strategi ini setara dengan Gather.
  • HASH_DISTRIBUTED: mempartisi ulang data input upstream berdasarkan kolom tertentu. Strategi ini umum digunakan dalam rencana eksekusi yang mengandung operator Join dan Agg.
  • BROADCAST_DISTRIBUTED: mendistribusikan satu salinan data upstream ke beberapa node downstream. Strategi ini terutama digunakan dalam rencana eksekusi MPP.

MergeSort

MergeSort adalah operator pengurutan gabungan yang menggabungkan beberapa aliran data terurut menjadi satu aliran data terurut. Contoh:

explain select * from sbtest1 where id > 1000 order by id limit 5,10; 

Output:

MergeSort(sort="id ASC", offset=?1, fetch=?2)   
   LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` WHERE (`id` > ?) ORDER BY `id` LIMIT (? + ?)")
MergeSort terdiri dari tiga bagian:
  • sort: bidang pengurutan dan urutan pengurutan. id ASC berarti urutan menaik berdasarkan bidang id. DESC berarti urutan menurun.
  • offset: jumlah baris yang dilewati saat mengambil set hasil. Nilainya diparameterisasi dalam contoh; nilai aktualnya adalah 5.
  • fetch: jumlah maksimum baris yang dikembalikan. Mirip dengan offset, nilainya diparameterisasi; nilai aktualnya adalah 10.

Project

Project melakukan operasi proyeksi, yang memilih kolom tertentu dari data input untuk output, atau mentransformasi kolom tertentu melalui fungsi atau ekspresi sebelum output. Operator ini juga dapat menyertakan konstanta.

explain select '你好, DRDS', 1 / 2, CURTIME(); 

Output:

Project(你好, DRDS="_UTF-16'你好, DRDS'", 1 / 2="1 / 2", CURTIME()="CURTIME()")
Rencana Project mencantumkan setiap nama kolom output beserta kolom, nilai, fungsi, atau ekspresi yang sesuai.

Filter

Filter menerapkan kondisi filter pada data input. Baris yang memenuhi kondisi diteruskan; jika tidak, baris tersebut dibuang. Berikut ini contoh kompleks yang mencakup sebagian besar operator yang dijelaskan di atas.

explain select k, avg(id) avg_id from sbtest1 where id > 1000 group by k having avg_id > 1300;

Output:

Filter(condition="avg_id > ?1")
  Project(k="k", avg_id="sum_pushed_sum / sum_pushed_count")
    SortAgg(group="k", sum_pushed_sum="SUM(pushed_sum)", sum_pushed_count="SUM(pushed_count)")
      MergeSort(sort="k ASC")
        LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT `k`, SUM(`id`) AS `pushed_sum`, COUNT(`id`) AS `pushed_count` FROM `sbtest1` WHERE (`id` > ?) GROUP BY `k` ORDER BY `k`")
Kondisi WHERE id>1000 tidak memiliki operator Filter yang sesuai karena telah dipush-down ke LogicalView. Anda dapat melihat WHERE (id > ?) dalam templat SQL LogicalView.