All Products
Search
Document Center

PolarDB:Operator

Last Updated:Jul 03, 2025

Topik ini menjelaskan cara operasi dilakukan menggunakan operator.

Operator

DeskripsiOperator
Operator yang digunakan untuk mendorong operasi ke node data.LogicalView, LogicalModifyView, PhyTableOperation, dan IndexScan
Operator yang digunakan untuk menggabungkan tabel.BKAJoin, NLJoin, HashJoin, SortMergeJoin, HashSemiJoin, SortMergeSemiJoin, dan MaterializedSemiJoin
Operator yang digunakan untuk mengurutkan baris data.MemSort, TopN, dan MergeSort
Operator agregat yang digunakan dalam klausa GROUP BY.HashAgg dan SortAgg
Operator yang digunakan untuk mendistribusikan ulang atau menggabungkan data.Exchange dan Gather
FilterFilter
Operator yang digunakan untuk memilih kolom.Project
Operator yang digunakan untuk menggabungkan set data.UnionAll dan UnionDistinct
Operator yang digunakan untuk menentukan jumlah maksimum baris keluaran. Anda dapat menggunakan operator limit atau argumen Offset dan Fetch untuk menentukan jumlah maksimum baris keluaran.Limit
Fungsi Window.OverWindow

Operator yang digunakan untuk mendorong operasi ke node data untuk dieksekusi

LogicalView

Operator LogicalView mengambil data dari node data. Operator ini mirip dengan operator TableScan dan IndexScan yang didukung oleh layanan database lainnya. Namun, LogicalView dapat mendorong lebih banyak operasi ke lapisan penyimpanan dibandingkan dengan TableScan dan IndexScan. Rencana LogicalView mencakup pernyataan SQL yang didorong ke lapisan penyimpanan untuk dieksekusi serta informasi terkait sumber data. Rencana ini menunjukkan operasi yang didorong ke lapisan penyimpanan, termasuk operator seperti Project, Filter, operator agregat, operator pengurutan, operator join, dan subquery. Anda dapat menjalankan pernyataan berikut untuk memeriksa informasi dalam rencana LogicalView dari rencana eksekusi.

explain select * From sbtest1 where id > 1000;

Informasi berikut dikembalikan:

Gather(concurrent=true)
   LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` WHERE (`id` > ?)")
Argumen dari operator LogicalView:
  • tables: menentukan tabel tempat pernyataan dijalankan. Dalam contoh, nilainya dalam format [Nomor seri shard database].Nama tabel_[Nomor seri shard tabel]. Rentang [000-127] menunjukkan shard tabel dengan nomor seri antara 000 hingga 127.
  • shardCount: menentukan jumlah total shard tabel yang dipindai. Dalam contoh, 128 shard tabel dengan nomor seri antara 000 hingga 127 dipindai.
  • sql: menentukan template SQL yang didorong ke lapisan penyimpanan. Saat PolarDB-X mengeksekusi pernyataan SQL, PolarDB-X mengganti nama tabel dengan nama tabel fisik dan tanda tanya (?) dengan nilai sebenarnya. Untuk detail lebih lanjut, lihat Manajemen Rencana Eksekusi.

LogicalModifyView

Operator LogicalModifyView digunakan untuk memodifikasi data pada node data. Rencana LogicalModifyView mencakup pernyataan SQL, yang dapat berupa INSERT, UPDATE, atau DELETE. Anda dapat menjalankan pernyataan berikut untuk memeriksa informasi dalam rencana LogicalModifyView dari rencana eksekusi.
  • Contoh 1
    explain update sbtest1 set c='Hello, DRDS' where id > 1000;

    Informasi berikut dikembalikan:

    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;

    Informasi berikut dikembalikan:

    LogicalModifyView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="DELETE FROM `sbtest1` WHERE (`id` > ?)")
Konten rencana LogicalModifyView serupa dengan konten rencana LogicalView. Rencana tersebut mencakup nama shard tabel fisik tempat pernyataan SQL dijalankan, jumlah shard tabel, dan template SQL. Jika fitur cache rencana eksekusi diaktifkan, pernyataan SQL diparameterisasi dan konstanta dalam template SQL diganti dengan tanda tanya (?).

PhyTableOperation

Operator PhyTableOperation digunakan untuk melakukan operasi pada shard tabel fisik.

Catatan Dalam kebanyakan kasus, operator ini digunakan untuk mengeksekusi pernyataan INSERT. Jika pernyataan SELECT dirutekan ke shard tabel untuk dieksekusi, operator PhyTableOperation ditugaskan untuk mengeksekusi pernyataan SELECT.
explain insert into sbtest1 values(1, 1, '1', '1'),(2, 2, '2', '2');

Informasi berikut dikembalikan:

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")
Dalam contoh, pernyataan INSERT dijalankan untuk menyisipkan dua baris data. Operasi PhyTableOperation dilakukan untuk setiap baris data. Argumen dari operator PhyTableOperation:
  • tables: menentukan nama tabel fisik. Dalam contoh, hanya satu tabel fisik yang ditentukan untuk setiap operasi PhyTableOperation.
  • sql: menentukan template SQL. Dalam template SQL, nama tabel dan konstanta diparameterisasi dan diganti dengan tanda tanya (?). Argumen params digunakan untuk menentukan nama tabel dan konstanta.
  • params: menentukan nilai argumen dalam template SQL, termasuk nama tabel dan konstanta.

IndexScan

IndexScan adalah operator yang mengambil data dari node data. Operasi IndexScan mirip dengan LogicalView, tetapi IndexScan memindai tabel indeks, sedangkan LogicalView memindai tabel dasar. Anda dapat menjalankan pernyataan berikut untuk memeriksa informasi dalam rencana IndexScan dari rencana eksekusi.

explain select * from sequence_one_base where integer_test=1;

Informasi berikut dikembalikan:

+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 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` = ?)") 
Jika tabel sequence_one_base tidak memiliki indeks sekunder global dan integer_test bukan kunci partisi, semua shard tabel sequence_one_base dipindai. Dalam contoh, tabel sequence_one_base memiliki indeks sekunder global bernama gsi_sequence_one_index yang dibuat pada kolom integer_test. Kondisi integer_test=1 digunakan untuk menentukan shard tabel indeks gsi_sequence_one_index. Dalam hal ini, sistem hanya memindai shard yang ditentukan.

Operator yang dapat dieksekusi pada node komputasi atau node data

UnionAll and UnionDistinct

Operator UnionAll sesuai dengan operator UNION ALL, sedangkan operator UnionDistinct sesuai dengan operator UNION DISTINCT. Operator union digunakan untuk menggabungkan dua set data input atau lebih menjadi satu set data. Contoh kode berikut menunjukkan rencana UnionDistinct:

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

Informasi berikut dikembalikan:

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

Operator Gather digunakan untuk menggabungkan beberapa set data menjadi satu set data. Dalam contoh sebelumnya yang menggambarkan rencana LogicalView, operator Gather digunakan untuk menggabungkan data dari shard tabel tertentu menjadi satu set data. Dalam kebanyakan kasus, operator Gather muncul sebelum operator LogicalView untuk menunjukkan bahwa data dari shard tabel tertentu digabungkan.

Exchange

Exchange adalah operator logis yang tidak digunakan untuk menghitung data. Operator ini mendistribusikan ulang data masukan dan mendorong data ke operator hilir. Metode redistribusi umum meliputi:
  • SINGLETON: menggabungkan beberapa set data. Operasinya sama dengan operator Gather.
  • HASH_DISTRIBUTED: mempartisi ulang data masukan berdasarkan kolom tertentu. Metode ini digunakan dalam rencana eksekusi yang mencakup operator join dan operator agregat.
  • BROADCAST_DISTRIBUTED: membagi satu set data menjadi beberapa set dan menyiarkannya ke node hilir yang berbeda. Metode ini digunakan dalam rencana eksekusi untuk pemrosesan paralel massal (MPP).

MergeSort

MergeSort adalah operator pengurutan gabungan yang digunakan untuk menggabungkan dan mengurutkan beberapa aliran data terurut menjadi satu aliran data terurut. Contoh kode berikut menunjukkan rencana MergeSort.

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

Informasi berikut dikembalikan:

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 (? + ?)")
Argumen dari operator MergeSort:
  • sort: menentukan kolom dan metode pengurutan. Dalam contoh, id menunjukkan pengurutan berdasarkan kolom id, dan ASC menunjukkan urutan menaik. Jika DESC ditentukan, urutan menjadi menurun.
  • offset: menentukan nilai offset setelah pengurutan. Dalam contoh, nilainya diparameterisasi. Nilai offset sebenarnya adalah 5.
  • fetch: menentukan jumlah maksimum baris data yang dapat dikembalikan. Dalam contoh, nilainya juga diparameterisasi. Nilai sebenarnya adalah 10.

Project

Operator Project digunakan untuk memilih kolom dari data masukan atau menghitung data dalam kolom tertentu menggunakan fungsi atau ekspresi tertentu, kemudian mengeluarkan hasilnya. Operator ini juga dapat mencakup konstanta.

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

Informasi berikut dikembalikan:

Project(Hello, DRDS="_UTF-16'Hello, DRDS'", 1 / 2="1 / 2", CURTIME()="CURTIME()")
Rencana operator Project mencakup nama setiap kolom yang ditentukan, nilai dalam pernyataan SQL, serta fungsi atau ekspresi yang digunakan untuk menghitung nilai tersebut.

Filter

Operator Filter digunakan untuk menyaring data. Rencana operator Filter mencakup kondisi yang digunakan untuk menyaring data. Operator ini mengeluarkan data yang memenuhi kondisi dan membuang data yang tidak memenuhi kondisi. Dalam contoh berikut, operator tertentu yang dijelaskan sebelumnya digunakan.

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

Informasi berikut dikembalikan:

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`")
Dalam contoh, tidak ada operator Filter yang ditugaskan untuk menyaring data berdasarkan kondisi WHERE id > 1000 karena kondisi tersebut didorong ke operasi LogicalView. Dalam kode sampel, Anda dapat melihat kondisi WHERE (id > ?) dalam rencana LogicalView.