Profil kueri menangkap detail eksekusi per-node untuk setiap kueri. Gunakan profil ini untuk mengidentifikasi bottleneck performa dan mengoptimalkan kinerja kueri.
Aktifkan profil kueri
Atur variabel enable_profile untuk mulai mengumpulkan profil:
SET enable_profile=true;enable_profile diatur ke true, SelectDB menghasilkan profil untuk setiap kueri yang dijalankan. Setiap profil mencatat detail eksekusi di seluruh node.Lihat profil kueri
Pernyataan SHOW QUERY PROFILE hanya didukung untuk versi SelectDB Core sebelum V4.0.0. Untuk SelectDB Core V4.0.0 dan versi lebih baru, pratinjau atau unduh profil kueri dari Konsol SelectDB, atau gunakan HTTP API. Untuk detailnya, lihat Gunakan fitur audit kueri dan Ekspor profil kueri.
Jalankan pernyataan berikut untuk menampilkan semua profil yang tersimpan:
SHOW QUERY PROFILE "/"\G;Setiap baris dalam hasil sesuai dengan satu profil:
SHOW QUERY PROFILE "/"\G
*************************** 1. row ***************************
Profile ID: c257c52f93e149ee-ace8ac14e8c9fef9
Task Type: QUERY
Start Time: 2021-04-08 11:30:50
End Time: 2021-04-08 11:30:50
Total: 9ms
Task State: EOF
User: root
Default Db: default_cluster:db1
Sql Statement: select tbl1.k1, sum(tbl1.k2) from tbl1 join tbl2 on tbl1.k1 = tbl2.k1 group by tbl1.k1 order by tbl1.k1Query ID dan query_id merujuk pada ID profil.Analisis profil kueri
Gunakan alur kerja tiga langkah berikut untuk menemukan bottleneck performa dalam suatu kueri. Setiap langkah menggali satu tingkat lebih dalam ke hierarki eksekusi.
Langkah 1: Identifikasi fragment terlambat
Tujuan: Temukan fragment mana yang menjadi bottleneck utama.
Pohon rencana eksekusi menunjukkan struktur fragment dan waktu eksekusi setiap fragment. Nilai MaxActiveTime pada setiap node pengirim adalah waktu eksekusi terlama di seluruh unit eksekusi dalam fragment tersebut.
SHOW QUERY PROFILE "/<profile_id>"\GContoh output:
SHOW QUERY PROFILE "/c257c52f93e149ee-ace8ac14e8c9fef9"\G
*************************** 1. row ***************************
Fragments:
┌──────────────────────┐
│[-1: DataBufferSender]│
│Fragment: 0 │
│MaxActiveTime: 6.626 ms│
└──────────────────────┘
│
┌──────────────────┐
│[9: EXCHANGE_NODE]│
│Fragment: 0 │
└──────────────────┘
│
┌──────────────────────┐
│[9: DataStreamSender] │
│Fragment: 1 │
│MaxActiveTime: 5.449 ms│
└──────────────────────┘
│
┌──────────────┐
│[4: SORT_NODE]│
│Fragment: 1 │
└──────────────┘
┌┘
┌─────────────────────┐
│[8: AGGREGATION_NODE]│
│Fragment: 1 │
└─────────────────────┘
└┐
┌──────────────────┐
│[7: EXCHANGE_NODE]│
│Fragment: 1 │
└──────────────────┘
│
┌──────────────────────┐
│[7: DataStreamSender] │
│Fragment: 2 │
│MaxActiveTime: 3.505 ms│
└──────────────────────┘
┌┘
┌─────────────────────┐
│[3: AGGREGATION_NODE]│
│Fragment: 2 │
└─────────────────────┘
│
┌───────────────────┐
│[2: HASH_JOIN_NODE]│
│Fragment: 2 │
└───────────────────┘
┌────────────┴────────────┐
┌──────────────────┐ ┌──────────────────┐
│[5: EXCHANGE_NODE]│ │[6: EXCHANGE_NODE]│
│Fragment: 2 │ │Fragment: 2 │
└──────────────────┘ └──────────────────┘
│ │
┌─────────────────────┐ ┌────────────────────────┐
│[5: DataStreamSender]│ │[6: DataStreamSender] │
│Fragment: 4 │ │Fragment: 3 │
│MaxActiveTime: 1.87 ms│ │MaxActiveTime: 636.767 us│
└─────────────────────┘ └────────────────────────┘
│ ┌┘
┌───────────────────┐ ┌───────────────────┐
│[0: OLAP_SCAN_NODE]│ │[1: OLAP_SCAN_NODE]│
│Fragment: 4 │ │Fragment: 3 │
└──────────────────┘ └──────────────────┘
│ │
┌─────────────┐ ┌─────────────┐
│[OlapScanner]│ │[OlapScanner]│
│Fragment: 4 │ │Fragment: 3 │
└─────────────┘ └─────────────┘
│ │
┌─────────────────┐ ┌─────────────────┐
│[SegmentIterator]│ │[SegmentIterator]│
│Fragment: 4 │ │Fragment: 3 │
└─────────────────┘ └─────────────────┘
1 row in set (0.02 sec)Pada contoh ini, Fragment 1 memiliki MaxActiveTime tertinggi (5.449 ms) — fragment ini merupakan bottleneck utama. Lanjutkan ke Langkah 2 dengan Fragment 1.
Langkah 2: Mengidentifikasi unit eksekusi paling lambat
Tujuan: Temukan instance node mana dalam fragment bottleneck yang paling banyak menghabiskan waktu.
Setelah mengidentifikasi fragment terlambat, tampilkan semua unit eksekusi (instance) di dalamnya:
SHOW QUERY PROFILE "/<profile_id>/<fragment_id>";Contoh output untuk Fragment 1:
SHOW QUERY PROFILE "/c257c52f93e149ee-ace8ac14e8c9fef9/1";
+-----------------------------------+-------------------+------------+
| Instances | Host | ActiveTime |
+-----------------------------------+-------------------+------------+
| c257c52f93e149ee-ace8ac14e8c9ff03 | 10.200.00.01:9060 | 5.449ms |
| c257c52f93e149ee-ace8ac14e8c9ff05 | 10.200.00.02:9060 | 5.367ms |
| c257c52f93e149ee-ace8ac14e8c9ff04 | 10.200.00.03:9060 | 5.358ms |
+-----------------------------------+-------------------+------------+Instance dengan ActiveTime tertinggi menjadi target Anda untuk Langkah 3.
Langkah 3: Periksa metrik per-operator
Tujuan: Tentukan operator mana yang paling banyak mengonsumsi waktu dan sumber daya pada unit eksekusi target.
SHOW QUERY PROFILE "/<profile_id>/<fragment_id>/<instance_id>"\GContoh output untuk instance c257c52f93e149ee-ace8ac14e8c9ff03 dalam Fragment 1:
SHOW QUERY PROFILE "/c257c52f93e149ee-ace8ac14e8c9fef9/1/c257c52f93e149ee-ace8ac14e8c9ff03"\G
*************************** 1. row ***************************
Instance:
┌───────────────────────────────────────┐
│[9: DataStreamSender] │
│(Active: 37.222 us, non-child: 0.40) │
│ - Counters: │
│ - BytesSent: 0.00 │
│ - IgnoreRows: 0 │
│ - OverallThroughput: 0.0 /sec │
│ - PeakMemoryUsage: 8.00 KB │
│ - SerializeBatchTime: 0ns │
│ - UncompressedRowBatchSize: 0.00 │
└───────────────────────────────────────┘
└┐
│
┌──────────────────────────────────┐
│[4: SORT_NODE] │
│(Active: 5.421 ms, non-child: 0.71)│
│ - Counters: │
│ - PeakMemoryUsage: 12.00 KB │
│ - RowsReturned: 0 │
│ - RowsReturnedRate: 0 │
└──────────────────────────────────┘
┌┘
│
┌───────────────────────────────────┐
│[8: AGGREGATION_NODE] │
│(Active: 5.355 ms, non-child: 10.68)│
│ - Counters: │
│ - BuildTime: 3.701us │
│ - GetResultsTime: 0 ns │
│ - HTResize: 0 │
│ - HTResizeTime: 1.211 us │
│ - HashBuckets: 0 │
│ - HashCollisions: 0 │
│ - HashFailedProbe: 0 │
│ - HashFilledBuckets: 0 │
│ - HashProbe: 0 │
│ - HashTravelLength: 0 │
│ - LargestPartitionPercent: 0 │
│ - MaxPartitionLevel: 0 │
│ - NumRepartitions: 0 │
│ - PartitionsCreated: 16 │
│ - PeakMemoryUsage: 34.02 MB │
│ - RowsProcessed: 0 │
│ - RowsRepartitioned: 0 │
│ - RowsReturned: 0 │
│ - RowsReturnedRate: 0 │
│ - SpilledPartitions: 0 │
└───────────────────────────────────┘
└┐
│
┌──────────────────────────────────────────┐
│[7: EXCHANGE_NODE] │
│(Active: 4.360 ms, non-child: 46.84) │
│ - Counters: │
│ - BytesReceived: 0.00 │
│ - ConvertRowBatchTime: 387 ns │
│ - DataArrivalWaitTime: 4.357 ms │
│ - DeserializeRowBatchTimer: 0 ns │
│ - FirstBatchArrivalWaitTime: 4.356 ms│
│ - PeakMemoryUsage: 0.00 │
│ - RowsReturned: 0 │
│ - RowsReturnedRate: 0 │
│ - SendersBlockedTotalTimer(*): 0 ns │
└──────────────────────────────────────────┘Nilai persentase Active yang tinggi dikombinasikan dengan persentase non-child yang tinggi pada suatu node menunjukkan bahwa node tersebut merupakan bottleneck (bukan operator anaknya). Fokuskan upaya optimasi Anda di sana.
Ekspor profil kueri
Ekspor profil kueri memerlukan SelectDB Core V3.0.4 atau versi lebih baru.
Ekspor profil ke file untuk analisis offline atau berbagi.
Aktifkan profil kueri.
SET enable_profile=true;Jalankan kueri yang ingin Anda profilkan.
-- Jalankan kueri target Anda. SelectDB akan menghasilkan profil untuk kueri tersebut. SELECT count(1) FROM test_table LIMIT 10;Dapatkan ID profil.
Versi SelectDB 4.0.x
Kirim permintaan HTTP untuk mendapatkan informasi kueri. Bidang
Query IDdalam respons adalah ID profil.curl -u'<userName>:<userPassword>' \ "http://<selectdbAddress>:<httpPort>/rest/v2/manager/query/query_info?is_all_node=true"Contoh respons:
{ "msg": "success", "code": 0, "data": { "column_names": [ "Query ID", "FE Node", "Query User", "Execution Database", "Sql", "Query Type", "Start Time", "End Time", "Execution Duration", "Status" ], "rows": [ [ ... ] ] }, "count": 0 }Versi SelectDB 3.0.x
Contoh berikut menunjukkan cara memperoleh SelectDB 3.0:
SHOW QUERY PROFILE "/";Contoh output:
+-----------------------------------+-----------+---------------------+---------------------+-------+------------+-------+------------------------------------+-------------------------------+ | Profile ID | Task Type | Start Time | End Time | Total | Task State | User | Default Db | Sql Statement | +-----------------------------------+-----------+---------------------+---------------------+-------+------------+-------+------------------------------------+-------------------------------+ | b9c9ba063d9d4365-97878361371e757a | QUERY | 2024-02-07 17:40:04 | 2024-02-07 17:40:04 | 32ms | EOF | admin | default_cluster:information_schema | select * from user_privileges | | 8800c306137e4072-9bb1ed419f4ac9f2 | QUERY | 2024-02-07 17:40:00 | 2024-02-07 17:40:00 | 3ms | ERR | admin | default_cluster:information_schema | select * from user_priveleges | | e2efdd1a996c4de2-ab939ad49b409990 | QUERY | 2024-02-07 17:39:51 | 2024-02-07 17:39:51 | 13ms | EOF | admin | | SELECT DATABASE() | +-----------------------------------+-----------+---------------------+---------------------+-------+------------+-------+------------------------------------+-------------------------------+Ekspor profil menggunakan ID-nya.
Placeholder Deskripsi Default <userName>Username untuk mengakses instans SelectDB — <userPassword>Password untuk mengakses instans SelectDB — <selectdbAddress>Endpoint instans SelectDB — <httpPort>Nomor port HTTP 8080 <query_id>ID profil dari langkah 3 — curl -u'<userName>:<userPassword>' \ "http://<selectdbAddress>:<httpPort>/api/profile?query_id=<query_id>"Untuk menyimpan output ke file, arahkan responsnya:
curl -u'<userName>:<userPassword>' \ "http://<selectdbAddress>:<httpPort>/api/profile?query_id=<query_id>" > res.txtGanti placeholder berikut dengan nilai aktual Anda:
(Opsional) Format file yang diekspor agar lebih mudah dibaca.
sudo sed -r 's/\\n/\n/g' res.txt | sed -r 's/\\t/\t/g' > new.txt
Referensi parameter profil
Tabel berikut menjelaskan semua parameter yang dikumpulkan dalam profil kueri.
Fragment
| Parameter | Deskripsi |
|---|---|
AverageThreadTokens | Jumlah thread yang digunakan untuk eksekusi fragment, tidak termasuk penggunaan kolam thread. |
Buffer Pool PeakReservation | Penggunaan memori puncak kolam buffer. |
MemoryLimit | Batas memori untuk kueri. |
PeakMemoryUsage | Penggunaan memori puncak suatu unit eksekusi selama kueri. |
RowsProduced | Jumlah baris yang kolomnya diproses. |
BlockMgr
| Parameter | Deskripsi |
|---|---|
BlocksCreated | Jumlah blok yang dibuat oleh BlockManager. |
BlocksRecycled | Jumlah blok yang digunakan ulang. |
BytesWritten | Ukuran total data yang ditulis ke disk. |
MaxBlockSize | Ukuran satu blok. |
TotalReadBlockTime | Waktu total yang dikonsumsi untuk membaca blok. |
DataStreamSender
| Parameter | Deskripsi |
|---|---|
BytesSent | Ukuran total data yang dikirim. Dihitung sebagai: jumlah penerima x ukuran data yang dikirim. |
IgnoreRows | Jumlah baris yang difilter. |
LocalBytesSent | Ukuran data yang dikirim oleh node lokal dan diterima oleh node lokal selama pertukaran data. |
OverallThroughput | Throughput total. Dihitung sebagai: BytesSent / waktu eksekusi. |
SerializeBatchTime | Waktu yang dikonsumsi untuk serialisasi data yang dikirim. |
UncompressedRowBatchSize | Ukuran data RowBatch yang dikirim sebelum kompresi. |
ODBC_TABLE_SINK
| Parameter | Deskripsi |
|---|---|
NumSentRows | Jumlah total baris yang ditulis ke tabel eksternal. |
TupleConvertTime | Waktu yang dikonsumsi untuk serialisasi data yang dikirim menjadi pernyataan INSERT. |
ResultSendTime | Waktu yang dikonsumsi untuk menulis data menggunakan driver Open Database Connectivity (ODBC). |
EXCHANGE_NODE
| Parameter | Deskripsi |
|---|---|
BytesReceived | Ukuran data yang diterima melalui jaringan. |
MergeGetNext | Jika pengurutan dilakukan pada node anak, node exchange melakukan penggabungan dan pengurutan terpadu. Ini adalah waktu total untuk penggabungan dan pengurutan tersebut, termasuk MergeGetNextBatch. |
MergeGetNextBatch | Waktu yang dikonsumsi oleh node merge untuk mengambil data. Untuk penggabungan dan pengurutan tingkat tunggal, data diambil dari antrian jaringan. Untuk penggabungan dan pengurutan multi-level, data diambil dari merger anak. |
ChildMergeGetNext | Ketika banyak pengirim mengirim data, penggabungan single-thread menjadi bottleneck. ApsaraDB for SelectDB menjalankan beberapa thread pada node merge anak untuk melakukan penggabungan dan pengurutan secara paralel. Ini adalah waktu kumulatif di seluruh thread. |
ChildMergeGetNextBatch | Waktu yang dikonsumsi untuk node merge anak mengambil data. Nilai tinggi dapat mengindikasikan bottleneck pada node pengirim data anak. |
DataArrivalWaitTime | Waktu total menunggu pengirim mengirim data. |
FirstBatchArrivalWaitTime | Waktu menunggu batch data pertama dari pengirim. |
DeserializeRowBatchTimer | Waktu yang dikonsumsi untuk deserialisasi data jaringan. |
SendersBlockedTotalTimer(*) | Waktu tunggu total di sisi pengirim ketika memori antrian DataStreamRecv telah penuh. |
ConvertRowBatchTime | Waktu yang dikonsumsi untuk mengonversi data yang diterima menjadi RowBatch. |
RowsReturned | Jumlah baris yang diterima. |
RowsReturnedRate | Laju penerimaan baris. |
SORT_NODE
| Parameter | Deskripsi |
|---|---|
InMemorySortTime | Waktu yang dikonsumsi untuk pengurutan dalam memori. |
InitialRunsCreated | Jumlah kali pengurutan diinisialisasi. Nilainya 1 untuk pengurutan dalam memori. |
SortDataSize | Ukuran total data yang diurutkan. |
MergeGetNext | Waktu yang dikonsumsi oleh MergeSort untuk mendapatkan batch berikutnya dari beberapa run yang telah diurutkan. Diukur hanya ketika data ditulis ke disk. |
MergeGetNextBatch | Waktu yang dikonsumsi oleh MergeSort untuk mengekstraksi batch dari run yang diurutkan berikutnya. Diukur hanya ketika data ditulis ke disk. |
TotalMergesPerformed | Jumlah kali penggabungan eksternal dilakukan. |
AGGREGATION_NODE
| Parameter | Deskripsi |
|---|---|
PartitionsCreated | Jumlah partisi untuk pemisahan kueri agregat. |
GetResultsTime | Waktu yang dikonsumsi untuk mendapatkan hasil agregasi dari partisi. |
HTResizeTime | Waktu yang dikonsumsi untuk mengubah ukuran tabel hash. |
HTResize | Jumlah kali tabel hash diubah ukurannya. |
HashBuckets | Jumlah bucket dalam tabel hash. |
HashBucketsWithDuplicate | Jumlah bucket dengan node duplikat dalam tabel hash. |
HashCollisions | Jumlah tabrakan hash dalam tabel hash. |
HashDuplicateNodes | Jumlah node duplikat yang termasuk dalam bucket yang sama dalam tabel hash. |
HashFailedProbe | Jumlah operasi probe yang gagal pada tabel hash. |
HashFilledBuckets | Jumlah bucket yang diisi data dalam tabel hash. |
HashProbe | Jumlah kali tabel hash di-query. |
HashTravelLength | Jumlah langkah yang ditempuh selama query tabel hash. |
HASH_JOIN_NODE
| Parameter | Deskripsi |
|---|---|
ExecOption | Metode pembangunan tabel hash untuk node anak kanan: sinkron atau asinkron. |
BuildBuckets | Jumlah bucket dalam tabel hash. |
BuildRows | Jumlah baris dalam tabel hash. |
BuildTime | Waktu yang dikonsumsi untuk membangun tabel hash. |
LoadFactor | Faktor beban tabel hash, yang menunjukkan jumlah bucket tidak kosong. |
ProbeRows | Jumlah baris tempat operasi probe hash dilakukan setelah melintasi node anak kiri. |
ProbeTime | Waktu yang dikonsumsi untuk melintasi node anak kiri untuk probe hash, tidak termasuk waktu untuk memanggil GetNext pada RowBatch dari node anak kiri. |
PushDownComputeTime | Waktu yang dikonsumsi untuk menghitung kondisi penurunan predikat. |
PushDownTime | Waktu total yang dikonsumsi untuk penurunan predikat. Kueri join pada node anak kanan yang memenuhi kondisi diubah menjadi kueri IN pada node anak kiri. |
CROSS_JOIN_NODE
| Parameter | Deskripsi |
|---|---|
ExecOption | Metode pembangunan RowBatchList untuk node anak kanan: sinkron atau asinkron. |
BuildRows | Jumlah baris RowBatchList (baris dalam node anak kanan). |
BuildTime | Waktu yang dikonsumsi untuk membangun RowBatchList. |
LeftChildRows | Jumlah baris dalam node anak kiri. |
LeftChildTime | Waktu yang dikonsumsi untuk melintasi node anak kiri dan kanan untuk menghasilkan Produk Kartesius, tidak termasuk waktu untuk memanggil GetNext pada RowBatch dari node anak kiri. |
UNION_NODE
| Parameter | Deskripsi |
|---|---|
MaterializeExprsEvaluateTime | Waktu yang dikonsumsi untuk mengevaluasi ekspresi konversi tipe dan materialisasi hasil ketika tipe bidang berbeda di kedua sisi UNION. |
ANALYTIC_EVAL_NODE
| Parameter | Deskripsi |
|---|---|
EvaluationTime | Waktu total yang dikonsumsi untuk komputasi fungsi analitik (fungsi jendela). |
GetNewBlockTime | Waktu yang dikonsumsi untuk mengalokasikan blok baru selama inisialisasi. Blok ini menyimpan jendela Baris atau seluruh partisi untuk komputasi fungsi analitik. |
PinTime | Waktu yang dikonsumsi untuk mengalokasikan blok baru atau membaca ulang blok yang ditulis ke disk kembali ke memori. |
UnpinTime | Waktu yang dikonsumsi untuk menulis data blok ke disk ketika blok tidak lagi diperlukan atau ketika operator saat ini mengalami tekanan memori tinggi. |
OLAP_SCAN_NODE
OLAP_SCAN_NODE menangani tugas pemindaian data. Node ini membuat satu atau beberapa Pemindai OLAP, masing-masing bertanggung jawab untuk memindai sebagian data. Profil diorganisasikan dalam tiga lapisan yang mencerminkan hierarki panggilan: OLAP_SCAN_NODE -> OlapScanner -> SegmentIterator.
Beberapa atau semua kondisi predikat didorong ke OLAP_SCAN_NODE. Kondisi yang dapat menggunakan indeks mesin penyimpanan didorong lebih jauh ke mesin penyimpanan untuk filtering; sisanya dievaluasi di OLAP_SCAN_NODE itu sendiri.
Contoh berikut menunjukkan profil OLAP_SCAN_NODE khas:
OLAP_SCAN_NODE (id=0):(Active: 1.2ms, % non-child: 0.00%)
- BytesRead: 265.00 B # Ukuran data yang dibaca dari file data. Misalnya, 10 x integer 32-bit = 40 byte. Ini mencerminkan data yang sepenuhnya dimuat ke memori, bukan ukuran I/O mentah.
- NumDiskAccess: 1 # Jumlah disk yang diakses oleh ScanNode.
- NumScanners: 20 # Jumlah pemindai yang dibuat oleh ScanNode.
- PeakMemoryUsage: 0.00 # Penggunaan memori puncak selama kueri.
- RowsRead: 7 # Baris yang dikembalikan dari mesin penyimpanan ke pemindai, tidak termasuk baris yang difilter oleh pemindai.
- RowsReturned: 7 # Baris yang dikembalikan dari ScanNode ke node induk.
- RowsReturnedRate: 6.979K /sec # RowsReturned / ActiveTime.
- TabletCount: 20 # Jumlah tablet yang diakses oleh ScanNode.
- TotalReadThroughput: 74.70 KB/sec # BytesRead dibagi dengan waktu eksekusi total. Untuk kueri yang terikat I/O, nilai ini mendekati throughput disk total.
- ScannerBatchWaitTime: 426.886us # Waktu bagi thread transfer untuk menunggu thread pemindai mengembalikan data RowBatch.
- ScannerWorkerWaitTime: 17.745us # Waktu bagi thread pemindai untuk menunggu thread pekerja yang tersedia di kolam thread.
OlapScanner:
- BlockConvertTime: 8.941us # Waktu untuk mengonversi blok vektorisasi menjadi RowBlock berstruktur baris. Blok vektorisasi adalah VectorizedRowBatch (V1) atau RowBlockV2 (V2).
- BlockFetchTime: 468.974us # Waktu bagi pembaca rowset untuk mendapatkan blok.
- ReaderInitTime: 5.475ms # Waktu bagi pemindai OLAP untuk menginisialisasi pembaca. Termasuk waktu pembuatan MergeHeap (V1) dan waktu untuk menghasilkan semua level iterator serta membaca grup blok pertama (V2).
- RowsDelFiltered: 0 # Baris yang difilter berdasarkan informasi DELETE dalam tablet dan baris yang ditandai untuk penghapusan dalam model Unique Key.
- RowsPushedCondFiltered: 0 # Baris yang difilter oleh predikat yang didorong dari operasi join (misalnya, dari BuildTable ke ProbeTable). Nilai ini perkiraan; filtering dapat dilewati jika efeknya buruk.
- ScanTime: 39.24us # Waktu bagi data untuk berpindah dari ScanNode ke node induk.
- ShowHintsTime_V1: 0ns # Hanya V1: waktu untuk membaca beberapa data untuk pemisahan ScanRange.
SegmentIterator:
- BitmapIndexFilterTimer: 779ns # Waktu untuk memfilter data menggunakan indeks bitmap.
- BlockLoadTime: 415.925us # Waktu bagi pembaca segmen (V1) atau iterator segmen (V2) untuk mendapatkan blok.
- BlockSeekCount: 12 # Jumlah pencarian blok selama pembacaan segmen.
- BlockSeekTime: 222.556us # Waktu yang dikonsumsi untuk pencarian blok selama pembacaan segmen.
- BlocksLoad: 6 # Jumlah blok yang dibaca.
- CachedPagesNum: 30 # Hanya V2: jumlah halaman yang hit cache halaman.
- CompressedBytesRead: 0.00 # V1: ukuran data sebelum dekompresi yang dibaca dari file. V2: ukuran halaman sebelum kompresi yang tidak hit cache halaman.
- DecompressorTimer: 0ns # Waktu yang dikonsumsi untuk dekompresi data.
- IOTimer: 0ns # Waktu I/O aktual untuk membaca data dari sistem operasi.
- IndexLoadTime_V1: 0ns # Hanya V1: waktu untuk membaca stream indeks.
- NumSegmentFiltered: 0 # Jumlah segmen yang sepenuhnya difilter berdasarkan statistik kolom dan kondisi kueri.
- NumSegmentTotal: 6 # Jumlah total segmen yang terlibat dalam kueri.
- RawRowsRead: 7 # Baris data sumber yang dibaca dari mesin penyimpanan setelah semua filtering sebelumnya.
- RowsBitmapIndexFiltered: 0 # Hanya V2: baris yang difilter menggunakan indeks bitmap.
- RowsBloomFilterFiltered: 0 # Hanya V2: baris yang difilter menggunakan indeks BloomFilter.
- RowsKeyRangeFiltered: 0 # Hanya V2: baris yang difilter menggunakan indeks SortkeyIndex.
- RowsStatsFiltered: 0 # V2: baris yang difilter menggunakan indeks ZoneMap, termasuk kondisi penghapusan. V1: termasuk baris yang difilter menggunakan indeks BloomFilter.
- RowsConditionsFiltered: 0 # Hanya V2: baris yang difilter oleh semua indeks kolom gabungan.
- RowsVectorPredFiltered: 0 # Baris yang difilter oleh operasi kondisi vektorisasi.
- TotalPagesNum: 30 # Hanya V2: jumlah total halaman yang dibaca.
- UncompressedBytesRead: 0.00 # V1: ukuran data setelah dekompresi (atau ukuran file jika tidak dikompresi). V2: ukuran halaman yang tidak hit cache halaman setelah dekompresi (atau ukuran halaman jika tidak dikompresi).
- VectorPredEvalTime: 0ns # Waktu untuk melakukan filtering oleh kondisi vektorisasi.
- ShortPredEvalTime: 0ns # Waktu untuk melakukan filtering oleh predikat short-circuit.
- PredColumnReadTime: 0ns # Waktu yang dikonsumsi untuk membaca kolom predikat.
- LazyReadTime: 0ns # Waktu yang dikonsumsi untuk membaca kolom non-predikat.
- OutputColumnTime: 0ns # Waktu yang dikonsumsi untuk materialisasi kolom.Hubungan antar metrik filtering
Metrik jumlah baris dalam profil OLAP_SCAN_NODE mengungkapkan seberapa efektif predikat dan indeks mengurangi volume data pada setiap tahap. Berikut ini menjelaskan urutan filtering format V2. Metrik format V1 memiliki makna yang sedikit berbeda.
Fase inisialisasi
Filtering terjadi dalam urutan berikut:
SortkeyIndex — Jika kueri memiliki rentang kunci (rentang kunci awalan), data difilter terlebih dahulu. Baris yang dieliminasi dicatat dalam
RowsKeyRangeFiltered.Indeks bitmap — Filtering akurat kolom diterapkan untuk kondisi yang cocok dengan indeks bitmap. Baris yang dieliminasi dicatat dalam
RowsBitmapIndexFiltered.Indeks BloomFilter — Kondisi kesetaraan (
=,IN,IS) difilter menggunakan indeks BloomFilter. Baris yang dieliminasi dicatat dalamRowsBloomFilterFiltered.CatatanRowsBloomFilterFiltereddihitung sebagai total baris segmen dikurangi baris yang tersisa setelah filtering BloomFilter. Nilai ini dapat tumpang tindih dengan baris yang sudah dieliminasi oleh indeks bitmap.Indeks ZoneMap — Data difilter berdasarkan kondisi kueri dan penghapusan. Baris yang dieliminasi dicatat dalam
RowsStatsFiltered.RowsConditionsFilteredadalah total baris yang difilter oleh semua indeks gabungan, termasukRowsBloomFilterFiltereddanRowsStatsFiltered.
Fase berikutnya
Setelah inisialisasi, data yang tersisa melewati tahapan tambahan:
RowsDelFiltered: Baris yang dieliminasi oleh kondisi penghapusan. Baris ini juga dihitung dalamRowsStatsFiltered.RawRowsRead: Baris yang tersisa setelah semua filtering sebelumnya.RowsRead: Baris yang dikembalikan dari mesin penyimpanan ke pemindai. Biasanya kurang dariRawRowsReadkarena mesin penyimpanan dapat mengagregasi baris. Selisih besar antaraRawRowsReaddanRowsReadmengindikasikan agregasi berat, yang bisa menjadi masalah performa.RowsReturned: Baris yang akhirnya dikembalikan oleh ScanNode ke node induk. Biasanya kurang dariRowsReadkarena predikat yang tidak didorong ke mesin penyimpanan diterapkan di tingkat pemindai. Selisih besar antaraRowsReaddanRowsReturnedberarti banyak predikat selektivitas tinggi tidak mencapai mesin penyimpanan, tempat filtering lebih efisien.
Bersama-sama, metrik Rows***Filtered memungkinkan Anda menilai apakah predikat kueri didorong ke mesin penyimpanan dan seberapa efektif setiap jenis indeks.
Metrik lainnya
Metrik di bawah
OlapScanner— sepertiIOTimerdanBlockFetchTime— terakumulasi di seluruh thread pemindai. Karena thread pemindai membaca data secara asinkron, nilai-nilai terakumulasi ini mencerminkan waktu kerja total pemindai, bukan waktu dinding ScanNode. PersentaseActivemencatat proporsi aktual waktu yang dikontribusikan ScanNode terhadap rencana eksekusi keseluruhan. Wajar jika nilaiIOTimermencapai puluhan detik, sementara nilaiActivehanya beberapa detik, karena dua alasan berikut:IOTimerterakumulasi di banyak pemindai yang berjalan paralel.Jika node induk lambat (misalnya, 100 detik), ScanNode (10 detik) selesai lebih awal dan menyiapkan data di latar belakang. Node induk kemudian mengambil data yang telah disiapkan, sehingga waktu
ActiveScanNode menjadi singkat.
NumScannersadalah jumlah tugas yang dikirimkan pemindai ke kolam thread, yang dikelola olehRuntimeState. Parameterdoris_scanner_thread_pool_thread_numdandoris_scanner_thread_pool_queue_sizemengontrol ukuran kolam thread dan panjang antrian. Jika jumlah thread berlebihan atau tidak mencukupi, efisiensi kueri terpengaruh. Anda juga dapat membagi beberapa metrik dengan jumlah thread untuk memperkirakan kasar waktu yang dikonsumsi setiap thread.TabletCountadalah jumlah tablet yang dipindai. Jumlah tablet tinggi berarti lebih banyak pembacaan acak dan operasi penggabungan data.UncompressedBytesReadmencerminkan volume data yang dibaca. Nilai tinggi dapat mengindikasikan beban I/O berat.Bandingkan
CachedPagesNumdenganTotalPagesNumuntuk menilai tingkat hit cache halaman. Tingkat hit yang lebih tinggi mengurangi overhead I/O dan dekompresi.
Buffer pool
| Parameter | Deskripsi |
|---|---|
AllocTime | Waktu yang dikonsumsi untuk alokasi memori. |
CumulativeAllocationBytes | Ukuran kumulatif memori yang dialokasikan. |
CumulativeAllocations | Jumlah kumulatif alokasi memori. |
PeakReservation | Ukuran reservasi puncak. |
PeakUnpinnedBytes | Ukuran data memori yang tidak dipin. |
PeakUsedReservation | Penggunaan memori dari reservasi. |
ReservationLimit | Batas reservasi dalam buffer pool. |