All Products
Search
Document Center

Lindorm:Ikhtisar rencana kueri

Last Updated:Jul 02, 2025

Lindorm memungkinkan Anda untuk melihat proses eksekusi pernyataan SQL di database. Ini membantu Anda menemukan dan memecahkan masalah terkait eksekusi SQL. Anda dapat menggunakan sintaks EXPLAIN untuk melihat rencana kueri dari pernyataan SQL pada berbagai kedalaman. Anda dapat menganalisis dan mengoptimalkan logika kueri berdasarkan rencana tersebut untuk meningkatkan performa kueri.

Mesin yang berlaku

Rencana kueri berlaku untuk LindormTable dan LindormTSDB.

Informasi latar belakang

Rencana kueri menjelaskan proses eksekusi pernyataan kueri SQL dalam database. Rencana kueri juga disebut sebagai rencana eksekusi. Saat Anda mendiagnosis performa suatu kueri, Anda dapat terlebih dahulu melihat rencana kueri dari pernyataan tersebut untuk memeriksa apakah kueri berhasil dieksekusi langkah demi langkah. Oleh karena itu, Anda harus memahami rencana kueri sebelum dapat mengoptimalkan pernyataan SQL. Untuk mencapai tujuan ini, Anda harus terlebih dahulu memahami operator yang digunakan dalam rencana kueri yang dapat dilihat dengan sintaks EXPLAIN.

Kedalaman rencana kueri

Anda dapat menggunakan sintaks EXPLAIN untuk melihat rencana kueri yang dihasilkan untuk pernyataan kueri pada tiga kedalaman berikut:

rencana logis, rencana fisik, dan rencana tipe.

Rencana logis

Rencana logis dari suatu kueri tidak dioptimalkan oleh pengoptimal.

Lindorm SQL menghasilkan rencana logis dari suatu kueri dengan menulis ulang kueri berdasarkan pohon sintaksis abstrak. Beberapa operasi logis dari kueri ditulis ulang dalam rencana kueri agar lebih mudah dioptimalkan dan dieksekusi. Sebagai contoh, Lindorm SQL dapat mengganti ekspresi konstan dalam kueri dengan konstanta yang telah dihitung dalam rencana kueri, atau mengganti fungsi AVG dalam kueri dengan fungsi SUM atau COUNT dalam rencana kueri. Anda dapat menentukan ekspresi WITHOUT IMPLEMENTATION dalam sintaks EXPLAIN untuk melihat rencana logis dari suatu kueri. Untuk informasi lebih lanjut tentang sintaks EXPLAIN, lihat EXPLAIN.

Pernyataan berikut digunakan sebagai contoh:

SELECT LOCATE('9378', p1) AS lp, COUNT(c1) FROM (SELECT * FROM test WHERE p1 like '3_%') GROUP BY lp ORDER BY lp;

Lihat rencana kueri dari pernyataan di atas.

EXPLAIN WITHOUT IMPLEMENTATION FOR SELECT LOCATE('9378', p1) AS lp, COUNT(c1) FROM (SELECT * FROM test WHERE p1 like '3_%') GROUP BY lp ORDER BY lp;
********************* 1. row *********************
PLAN: LogicalSort(sort0=[$0], dir0=[ASC])
  LogicalAggregate(group=[{0}], EXPR$1=[COUNT($1)])
    LogicalProject(lp=[LOCATE('9378', $0)], c1=[$1])
      LogicalFilter(condition=[LIKE($0, '3_%')])
        LindormTableScan(table=[[db, test]])

Rencana fisik

Rencana fisik dari suatu kueri dioptimalkan oleh pengoptimal. Pengoptimal Lindorm SQL memilih mode eksekusi terbaik untuk rencana logis berdasarkan kebijakan aturan tertentu atau kebijakan biaya. Mode eksekusi yang dipilih dan kandidatnya disebut sebagai rencana fisik.

Saat Anda menggunakan sintaks EXPLAIN untuk melihat rencana kueri dari suatu kueri, rencana fisik dari kueri tersebut dikembalikan secara default. Rencana fisik berisi operator yang dieksekusi oleh Lindorm SQL dan yang dieksekusi oleh LindormTable.

Rencana fisik dari suatu kueri dapat dengan jelas menunjukkan proses eksekusi dari pernyataan SQL, termasuk mode pemindaian data dan urutan operasi relasional.

Pernyataan berikut digunakan sebagai contoh:

SELECT LOCATE('9378', p1) AS lp, COUNT(c1) FROM (SELECT * FROM test WHERE p1 like '3_%') GROUP BY lp ORDER BY lp;

Lihat rencana fisik dari pernyataan di atas.

EXPLAIN SELECT LOCATE('9378', p1) AS lp, COUNT(c1) FROM (SELECT * FROM test WHERE p1 like '3_%') GROUP BY lp ORDER BY lp;
********************* 1. row *********************
PLAN: EnumerableSort(sort0=[$0], dir0=[ASC])
  EnumerableAggregate(group=[{0}], EXPR$1=[COUNT($1)])
    EnumerableCalc(expr#0..3=[{inputs}], expr#4=['9378'], expr#5=[LOCATE($t4, $t0)], lp=[$t5], c1=[$t1])
      EnumerableLindormDirectQuery(
explanation=[SELECT p1,c1,c2,c3 from test where ((p1 < 4) AND (p1 >= 3) AND (p1 LIKE 3_%)) supportEmptyResult true
Candidate tables: 
    Data table: test, scores=1..0..1, need query back=false, sort type=FORWARD
Chose data table [test].
---
SELECT p1,c1,c2,c3 from test supportEmptyResult true
SingleScan on test
    ranges: [3\x00, 4\x00]
    filter: ((p1 < 4) AND (p1 >= 3) AND (p1 LIKE 3_%))
])

Rencana tipe

Rencana tipe dari suatu kueri hanya berisi tipe setiap kolom dalam set hasil dari kueri tersebut.

Rencana tipe dihasilkan berdasarkan tipe kueri dan digunakan dalam skenario tertentu. Dibandingkan dengan rencana logis dan fisik, rencana tipe berisi informasi paling sedikit. Anda dapat menentukan ekspresi WITH TYPE dalam sintaks EXPLAIN untuk melihat rencana tipe dari suatu kueri. Untuk informasi lebih lanjut tentang sintaks EXPLAIN, lihat EXPLAIN.

Pernyataan berikut digunakan sebagai contoh:

SELECT LOCATE('9378', p1) AS lp, COUNT(c1) FROM (SELECT * FROM test WHERE p1 like '3_%') GROUP BY lp ORDER BY lp;

Lihat rencana tipe dari pernyataan di atas.

EXPLAIN WITH TYPE FOR SELECT LOCATE('9378', p1) AS lp, COUNT(c1) FROM (SELECT * FROM test WHERE p1 like '3_%') GROUP BY lp ORDER BY lp;
********************* 1. row *********************
PLAN: lp INTEGER NOT NULL,
EXPR$1 BIGINT NOT NULL

Operator dalam rencana kueri

Bagian ini menjelaskan operator umum yang termasuk dalam rencana kueri.

Operator fisik tujuan umum

Lindorm SQL menyediakan serangkaian operator fisik tujuan umum untuk pengoptimal guna menghasilkan rencana fisik. Operator ini dapat digunakan untuk melakukan operasi komputasi tujuan umum seperti pengurutan, agregasi, proyeksi, dan perhitungan dalam kueri. Operator fisik tujuan umum berikut sering digunakan dalam kueri:

  • EnumerableLimit

    Operator ini digunakan untuk melewati dan memotong data set hasil berdasarkan nilai OFFSET dan LIMIT yang ditentukan. Sumber nilai offset dan fetch yang diperlukan oleh operator ini ditampilkan dalam rencana kueri yang dikembalikan.

  • EnumerableSort

    Operator ini digunakan untuk mengurutkan data berdasarkan klausa ORDER BY yang ditentukan dalam kueri. Algoritma pengurutan default diimplementasikan berdasarkan treemapping. Sumber kunci pengurutan yang digunakan oleh operator ini ditampilkan dalam rencana kueri yang dikembalikan.

  • EnumerableAggregate

    Operator ini digunakan untuk mengumpulkan data yang dikembalikan secara iteratif oleh operator tingkat bawah berdasarkan fungsi agregat yang ditentukan dan kolom pengelompokan yang mungkin. Operator ini juga dapat digunakan untuk mengimplementasikan sintaks DISTINCT. Kunci pengelompokan operator dan ekspresi terkait dengan fungsi agregat ditampilkan dalam rencana kueri yang dikembalikan.

  • EnumerableCalc

    Operator ini dapat digunakan untuk menghitung nilai ekspresi umum, seperti ekspresi aritmatika dan ekspresi fungsi selain fungsi agregat dan fungsi jendela. Selain itu, operasi perhitungan seperti proyeksi dan penyaringan juga diimplementasikan menggunakan operator ini.

Operator fisik yang diperluas

EnumerableLindormDirectQuery

Operator EnumerableLindormDirectQuery adalah operator ekstensi tujuan umum yang disediakan oleh Lindorm SQL untuk menunjukkan bagian kueri yang didorong ke mesin penyimpanan untuk komputasi. Hasil yang dikembalikan oleh operator ini terkandung dalam bidang explanation. Informasi yang terkandung dalam bidang explanation bervariasi dengan mesin Lindorm yang berbeda.

Mesin

Informasi yang terkandung dalam bidang explanation

LindormTable

Operasi perhitungan yang dilakukan pada LindormTable, termasuk informasi berikut:

  • Pemilihan indeks.

  • Metode pemindaian data.

  • Rentang pemindaian data.

  • Kondisi filter.

LindormTSDB

Parameter API LindormTSDB yang dipanggil.

Operator yang diperluas untuk LindormTSDB

  • TSDBDataScanRel

    Operator ini adalah varian dari operator logis LogicalTableScan dan digunakan untuk melakukan operasi pemindaian pada metrik tertentu. Bidang berikut dari operator ini ditampilkan dalam rencana kueri yang dikembalikan:

    • filter: kondisi filter dari operasi pemindaian.

    • project: pemetaan antara ekspresi operator dalam rencana kueri tingkat lebih tinggi dengan tabel deret waktu.

    • hint: petunjuk yang didorong bersama dengan operasi pemindaian, seperti _l_series_only.

  • TSDBShowTagRel

    Operator ini digunakan untuk mengoptimalkan kueri yang dilakukan pada semua nilai tag dalam kolom tag. Operator ini memberikan kemampuan yang sama dengan sintaks SHOW TAG VALUES dari InfluxDB. Operator ini biasanya berada di level terendah dalam pohon rencana kueri, mirip dengan operator TSDBDataScanRel. Operator ini digunakan untuk menunjukkan metode pemindaian data dalam mesin data. Hanya kueri dalam format berikut yang dapat dioptimalkan menggunakan operator ini: SELECT DISTINCT ${tagkey column} FROM ${table}.

  • TSDBAggScanRel

    Operator ini adalah kombinasi dari operator EnumerableAggregation dan TSDBDataScanRel dan digunakan untuk mengumpulkan deret waktu.

  • EnumerableDownsampleQuery

    Operator ini spesifik untuk sintaks SAMPLE BY yang disediakan oleh Lindorm SQL. Sintaks SAMPLE BY adalah dialek SQL yang diperluas untuk LindormTSDB dalam skenario downsampling. Semua konteks sintaks ini diperluas, termasuk operator logis LogicalDownsampleQuery dan operator fisik EnumerableDownsampleQuery. Oleh karena itu, operator EnumerableDownsampleQuery hanya disertakan dalam rencana kueri dari kueri yang menggunakan sintaks SAMPLE BY.

    Bidang berikut dari operator ini ditampilkan dalam rencana kueri yang dikembalikan:

    • project: pemetaan antara ekspresi operator dalam rencana kueri tingkat lebih tinggi dengan operator EnumerableDownsampleQuery.

    • filter: kondisi filter yang didorong ke LindormTSDB bersama dengan operasi downsampling.

    • ds_agg: fungsi downsampling yang digunakan dalam kueri dan parameter dari fungsi tersebut.

    • aggregator: operator agregat yang didorong ke LindormTSDB bersama dengan operasi pengumpulan lintas deret waktu.

    • hint: petunjuk yang didorong ke LindormTSDB.