Anda dapat menganalisis profil kueri untuk meningkatkan kinerja kueri. Topik ini menjelaskan cara mendapatkan profil kueri dari ApsaraDB for SelectDB.
Aktifkan fitur profil kueri
Konfigurasikan variabel enable_profile untuk mengaktifkan fitur profil kueri. Untuk detail lebih lanjut, lihat Manajemen Variabel.
SET enable_profile=true;Setelah mengaktifkan fitur profil kueri, SelectDB akan menghasilkan profil untuk setiap eksekusi kueri.
Profil kueri mencakup detail eksekusi kueri di setiap node, membantu Anda menganalisis hambatan kinerja kueri.
Lihat profil kueri
Eksekusi pernyataan berikut untuk melihat semua profil kueri yang disimpan:
Pernyataan berikut didukung hanya untuk instans SelectDB dengan versi kernel lebih lama dari SelectDB Core V4.0.0. Jika instans Anda menggunakan SelectDB Core V4.0.0 atau lebih baru, kami menyarankan Anda untuk melihat pratinjau atau mengunduh profil kueri di Konsol SelectDB. Alternatifnya, Anda dapat mengirim permintaan HTTP untuk mendapatkan profil kueri. Untuk informasi lebih lanjut, lihat Gunakan fitur audit kueri dan Ekspor profil kueri.
SHOW QUERY PROFILE "/"\G;Dalam hasil set yang dikembalikan, setiap baris data sesuai dengan profil kueri. Anda dapat melihat detail profil kueri berdasarkan ID profil.
Dalam permintaan HTTP yang dikirim ke profil kueri, bidang seperti Query ID dan query_id menunjukkan ID 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.k1Gunakan profil kueri
Ikuti langkah-langkah berikut untuk mengatasi masalah hambatan kinerja pada pernyataan kueri SQL:
-
Lihat pohon rencana eksekusi.
Langkah ini digunakan untuk menganalisis rencana eksekusi secara keseluruhan dan melihat waktu eksekusi setiap fragmen. Dalam hasil yang dikembalikan, setiap node ditandai dengan fragmennya, dan node pengirim setiap fragmen mencantumkan waktu eksekusinya. Waktu ini merupakan yang terlama di antara waktu eksekusi semua unit eksekusi dalam sebuah fragmen. Pohon rencana eksekusi membantu mengidentifikasi fragmen yang paling banyak memakan waktu. Contoh kode berikut menunjukkan contoh pohon rencana eksekusi:
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) -
Lihat unit eksekusi dalam fragmen tertentu.
Dalam contoh sebelumnya, Fragmen 1 adalah fragmen yang paling banyak memakan waktu. Oleh karena itu, Anda dapat memeriksa unit eksekusi dalam Fragmen 1. Contoh kode berikut menunjukkan cara menanyakan node eksekusi dan waktu eksekusi semua unit eksekusi dalam Fragmen 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 | +-----------------------------------+-------------------+------------+ -
Lihat unit eksekusi tertentu.
Anda dapat melihat profil setiap operator pada unit eksekusi tertentu. Contoh kode berikut menunjukkan cara menanyakan profil setiap operator pada unit eksekusi c257c52f93e149ee-ace8ac14e8c9ff03 dalam Fragmen 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 │ └──────────────────────────────────────────┘
Ekspor profil kueri
Ikuti langkah-langkah berikut untuk mengekspor profil kueri untuk analisis selanjutnya:
Hanya instans SelectDB yang menjalankan SelectDB Core V3.0.4 atau lebih baru yang mendukung fitur ini.
Aktifkan fitur profil kueri.
SET enable_profile=true;Eksekusi pernyataan kueri.
Gantilah kode berikut dengan pernyataan kueri SQL yang ingin Anda gunakan dalam penggunaan aktual.
-- Kirim permintaan SQL. Dalam hal ini, profil dari pernyataan kueri dibuat. SELECT count(1) FROM test_table LIMIT 10;Tanyakan ID profil.
SelectDB Core V3.0.x
Contoh kode berikut menunjukkan cara meminta ID profil dari instans SelectDB yang menjalankan SelectDB Core V3.0.x:
SHOW QUERY PROFILE "/"; +-----------------------------------+-----------+---------------------+---------------------+-------+------------+-------+------------------------------------+-------------------------------+ | 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() | +-----------------------------------+-----------+---------------------+---------------------+-------+------------+-------+------------------------------------+-------------------------------+SelectDB Core V4.0.x
Contoh kode berikut menunjukkan cara meminta ID profil dari instans ApsaraDB untuk SelectDB yang menjalankan SelectDB Core V4.0.x. Bidang
Query IDmenunjukkanID profil.curl -u'<userName>:<userPassword>' "http://<selectdbAddress>:<httpPort>/rest/v2/manager/query/query_info?is_all_node=true" # Response { "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 }Jalankan perintah curl untuk mengekspor profil ke file berdasarkan ID profil:
curl -u'<userName>:<userPassword>' "http://<selectdbAddress>:<httpPort>/api/profile?query_id=<query_id>" # Anda dapat menggunakan simbol pengalihan untuk mengekspor profil ke file. curl -u'<userName>:<userPassword>' "http://<selectdbAddress>:<httpPort>/api/profile?query_id=<query_id>" > res.txtParameter
Parameter
Deskripsi
userName
Nama pengguna yang digunakan untuk mengakses instans SelectDB.
userPassword
Kata sandi yang digunakan untuk mengakses instans SelectDB.
selectdbAddress
Titik akhir instans SelectDB.
httpPort
Nomor port HTTP instans SelectDB. Nilai default: 8080.
query_id
ID kueri dari profil.
Parameter profil
Tabel berikut menjelaskan parameter dalam statistik yang telah dikumpulkan.
Fragmen
Parameter | Deskripsi |
AverageThreadTokens | Jumlah thread yang digunakan untuk eksekusi fragmen, tidak termasuk penggunaan kolam thread. |
Buffer Pool PeakReservation | Penggunaan memori puncak dari kolam buffer. |
MemoryLimit | Batas memori untuk kueri. |
PeakMemoryUsage | Penggunaan memori puncak dari 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 kembali. |
BytesWritten | Total ukuran data yang ditulis ke disk. |
MaxBlockSize | Ukuran satu blok. |
TotalReadBlockTime | Total waktu yang dikonsumsi untuk membaca blok. |
DataStreamSender
Parameter | Deskripsi |
BytesSent | Total ukuran data yang dikirim. Ukuran data dihitung dengan menggunakan rumus berikut: Total ukuran data yang dikirim = Jumlah penerima × Ukuran data yang dikirim. |
IgnoreRows | Jumlah baris yang difilter. |
LocalBytesSent | Ukuran data yang dikirim oleh node lokal dan kemudian diterima oleh node lokal selama pertukaran data. |
OverallThroughput | Total throughput. Total throughput dihitung dengan menggunakan rumus berikut: Total throughput = Nilai parameter BytesSent/Waktu eksekusi. |
SerializeBatchTime | Waktu yang dikonsumsi untuk menyerialisasi data yang dikirim. |
UncompressedRowBatchSize | Ukuran data RowBatch yang dikirim sebelum kompresi. |
ODBC_TABLE_SINK
Parameter | Deskripsi |
NumSentRows | Total jumlah baris yang ditulis ke tabel eksternal. |
TupleConvertTime | Waktu yang dikonsumsi untuk menyerialisasi data terkirim ke dalam 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 pertukaran melakukan penggabungan dan pengurutan terpadu serta mengeluarkan hasil yang terurut. Parameter ini menunjukkan total waktu yang dikonsumsi untuk penggabungan dan pengurutan, termasuk waktu yang ditentukan oleh parameter MergeGetNextBatch. |
MergeGetNextBatch | Waktu yang dikonsumsi oleh node penggabungan untuk mengambil data. Untuk penggabungan dan pengurutan tingkat tunggal, objek yang mengambil data adalah antrian jaringan. Untuk penggabungan dan pengurutan multi-tingkat, objek yang mengambil data adalah penggabung anak. |
ChildMergeGetNext | Jika terlalu banyak pengirim mengirim data, penggabungan satu-thread menjadi hambatan kinerja. Dalam hal ini, ApsaraDB untuk SelectDB memulai beberapa thread pada node penggabung anak untuk melakukan penggabungan dan pengurutan secara paralel. Parameter ini mencatat waktu yang dikonsumsi oleh node penggabung anak untuk pengurutan, yang merupakan jumlah dari waktu yang dikonsumsi oleh semua thread. |
ChildMergeGetNextBatch | Waktu yang dikonsumsi untuk node penggabung anak mengambil data. Jika terlalu banyak waktu dikonsumsi, mungkin ada hambatan pada node pengiriman data anak. |
DataArrivalWaitTime | Total waktu menunggu pengirim mengirim data. |
FirstBatchArrivalWaitTime | Waktu menunggu batch pertama mendapatkan data dari pengirim. |
DeserializeRowBatchTimer | Waktu yang dikonsumsi untuk mendeserialisasi data jaringan. |
SendersBlockedTotalTimer(*) | Total waktu tunggu di sisi pengirim jika memori antrian DataStreamRecv sepenuhnya terisi. |
ConvertRowBatchTime | Waktu yang dikonsumsi untuk mengonversi data yang diterima menjadi data RowBatch. |
RowsReturned | Jumlah baris yang diterima. |
RowsReturnedRate | Tingkat penerimaan baris. |
SORT_NODE
Parameter | Deskripsi |
InMemorySortTime | Waktu yang dikonsumsi untuk pengurutan dalam memori. |
InitialRunsCreated | Jumlah inisialisasi pengurutan. Nilainya adalah 1 untuk pengurutan dalam memori. |
SortDataSize | Total ukuran data yang diurutkan. |
MergeGetNext | Waktu yang dikonsumsi oleh MergeSort untuk mendapatkan batch berikutnya dari beberapa run yang diurutkan. Pengaturan waktu hanya dilakukan ketika data ditulis ke disk. |
MergeGetNextBatch | Waktu yang dikonsumsi oleh MergeSort untuk mengekstrak batch run yang diurutkan berikutnya. Pengaturan waktu hanya dilakukan ketika data ditulis ke disk. |
TotalMergesPerformed | Jumlah kali penggabungan eksternal dilakukan. |
AGGREGATION_NODE
Parameter | Deskripsi |
PartitionsCreated | Jumlah partisi ke mana kueri agregat dibagi. |
GetResultsTime | Waktu yang dikonsumsi untuk mendapatkan hasil agregat 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 yang terjadi dalam tabel hash. |
HashDuplicateNodes | Jumlah node duplikat yang termasuk dalam bucket yang sama dalam tabel hash. |
HashFailedProbe | Jumlah operasi probe gagal yang dilakukan pada tabel hash. |
HashFilledBuckets | Jumlah bucket yang diisi dengan data dalam tabel hash. |
HashProbe | Jumlah kali tabel hash di-query. |
HashTravelLength | Jumlah langkah yang dipindahkan selama query tabel hash. |
HASH_JOIN_NODE
Parameter | Deskripsi |
ExecOption | Metode pembuatan tabel hash untuk node anak kanan. Metode-metodenya mencakup metode sinkron dan asinkron. Node anak kanan dalam join mungkin berupa tabel atau subkueri. Aturan ini juga berlaku untuk node anak kiri. |
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 yang tidak kosong. |
ProbeRows | Jumlah baris tempat operasi probe hash dilakukan setelah node anak kiri dilintasi. |
ProbeTime | Waktu yang dikonsumsi untuk melintasi node anak kiri untuk operasi probe hash, tidak termasuk waktu yang dikonsumsi untuk memanggil operasi GetNext untuk RowBatch di sisi node anak kiri. |
PushDownComputeTime | Waktu yang dikonsumsi untuk menghitung kondisi penurunan predikat. |
PushDownTime | Total waktu 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 konstruksi RowBatchList untuk node anak kanan. Metode-metodenya mencakup metode sinkron dan asinkron. |
BuildRows | Jumlah baris RowBatchList, yang menunjukkan jumlah baris dari node anak kanan. |
BuildTime | Waktu yang dikonsumsi untuk konstruksi RowBatchList. |
LeftChildRows | Jumlah baris dari node anak kiri. |
LeftChildTime | Waktu yang dikonsumsi untuk melintasi node anak kiri dan kanan untuk menghasilkan produk Kartesius, tidak termasuk waktu yang dikonsumsi untuk memanggil operasi GetNext untuk RowBatch di sisi node anak kiri. |
UNION_NODE
Parameter | Deskripsi |
MaterializeExprsEvaluateTime | Waktu yang dikonsumsi untuk menghitung ekspresi konversi tipe dan mematerialisasi hasilnya jika jenis bidang di kedua sisi UNION tidak konsisten. |
ANALYTIC_EVAL_NODE
Parameter | Deskripsi |
EvaluationTime | Total waktu yang dikonsumsi untuk komputasi fungsi analitik (fungsi jendela). |
GetNewBlockTime | Waktu yang dikonsumsi untuk mengajukan blok baru selama inisialisasi. Blok digunakan untuk menyimpan jendela baris atau seluruh partisi untuk komputasi fungsi analitik. |
PinTime | Waktu yang dikonsumsi untuk mengajukan blok baru atau membaca kembali blok yang ditulis ke disk kembali ke memori. |
UnpinTime | Waktu yang dikonsumsi untuk menulis data dari blok ke disk jika blok tidak diperlukan atau jika operator saat ini memiliki tekanan memori tinggi. |
OLAP_SCAN_NODE
OLAP_SCAN_NODE bertanggung jawab atas tugas pemindaian data spesifik. Node ini menghasilkan satu atau lebih pemindai OLAP, di mana setiap thread pemindai bertugas memindai sebagian data.
Sebagian atau seluruh kondisi predikat dalam kueri didorong ke OLAP_SCAN_NODE. Sebagian dari kondisi predikat tersebut didorong ke mesin penyimpanan untuk penyaringan data menggunakan indeks mesin penyimpanan. Kondisi predikat lainnya disimpan di OLAP_SCAN_NODE dan digunakan untuk menyaring data yang dikembalikan dari mesin penyimpanan.
Profil OLAP_SCAN_NODE umumnya digunakan untuk menganalisis efisiensi pemindaian data. Profil ini terbagi menjadi tiga lapisan berdasarkan hubungan panggilan: OLAP_SCAN_NODE, OlapScanner, dan SegmentIterator.
Kode contoh berikut menunjukkan node OLAP_SCAN_NODE yang tipikal. Arti beberapa metrik dapat bervariasi tergantung pada format penyimpanan (V1 atau V2).
OLAP_SCAN_NODE (id=0):(Active: 1.2ms, % non-child: 0.00%)
- BytesRead: 265.00 B # Ukuran data yang dibaca dari file data. Misalnya, jika 10 bilangan bulat 32-bit dibaca, ukuran datanya adalah 10 × 4 byte = 40 byte. Parameter ini hanya menunjukkan ukuran data yang sepenuhnya ditampilkan di memori, dan tidak menunjukkan ukuran I/O aktual.
- NumDiskAccess: 1 # Jumlah disk yang terlibat dalam node ScanNode.
- NumScanners: 20 # Jumlah pemindai yang dihasilkan oleh node ScanNode.
- PeakMemoryUsage: 0.00 # Penggunaan memori puncak selama kueri. Memori tidak digunakan.
- RowsRead: 7 # Jumlah baris yang dikembalikan dari mesin penyimpanan ke pemindai, tidak termasuk jumlah baris yang difilter oleh pemindai.
- RowsReturned: 7 # Jumlah baris yang dikembalikan dari node ScanNode ke node induk.
- RowsReturnedRate: 6.979K /detik # RowsReturned/ActiveTime
-TabletCount: 20 # Jumlah tablet yang terlibat dalam node ScanNode.
- TotalReadThroughput: 74.70 KB/detik # Total throughput baca yang dihitung dengan membagi BytesRead dengan total waktu eksekusi pada node ini dari inisiasi hingga penyelesaian kueri. Untuk kueri yang dibatasi I/O, nilainya mendekati total throughput disk.
- 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 yang dikonsumsi untuk mengonversi blok vektor ke RowBlock berbasis baris. Blok vektor adalah VectorizedRowBatch dalam V1 dan RowBlockV2 dalam V2.
- BlockFetchTime: 468.974us # Waktu bagi pembaca rowset untuk mendapatkan blok.
- ReaderInitTime: 5.475ms # Waktu bagi pemindai OLAP untuk menginisialisasi pembaca. Waktu pembuatan MergeHeap termasuk dalam V1. Waktu yang dikonsumsi untuk menghasilkan semua level Iterator dan membaca kelompok blok pertama termasuk dalam V2.
- RowsDelFiltered: 0 # Jumlah baris yang difilter, termasuk yang berdasarkan informasi DELETE dalam tablet dan yang untuk baris yang ditandai untuk penghapusan dalam model Unique Key.
- RowsPushedCondFiltered: 0 # Kondisi yang difilter berdasarkan predikat yang didorong ke bawah, seperti kondisi yang dilewatkan dari BuildTable ke ProbeTable dalam operasi join. Nilai ini tidak akurat. Jika efek penyaringan buruk, tidak ada operasi penyaringan yang dilakukan.
- ScanTime: 39.24us # Waktu bagi data untuk dikembalikan dari ScanNode ke node induk.
- ShowHintsTime_V1: 0ns # Parameter ini tidak berlaku dalam V2. Beberapa data dibaca untuk pemisahan ScanRange dalam V1.
SegmentIterator:
- BitmapIndexFilterTimer: 779ns # Waktu yang dikonsumsi untuk menyaring data menggunakan indeks bitmap.
- BlockLoadTime: 415.925us # Waktu yang dikonsumsi untuk pembaca segmen (V1) atau iterator segmen (V2) untuk mendapatkan blok.
- BlockSeekCount: 12 # Jumlah pencarian blok yang dilakukan selama pembacaan segmen.
- BlockSeekTime: 222.556us # Waktu yang dikonsumsi untuk pencarian blok selama pembacaan segmen.
- BlocksLoad: 6 # Jumlah blok yang dibaca.
- CachedPagesNum: 30 # Jumlah halaman yang mengenai cache setelah cache halaman diaktifkan hanya dalam V2.
- CompressedBytesRead: 0.00 # Ukuran data sebelum dekompresi yang dibaca dari file dalam V1, atau ukuran halaman yang dibaca sebelum kompresi yang tidak mengenai cache halaman dalam V2.
- DecompressorTimer: 0ns # Waktu yang dikonsumsi untuk dekompresi data.
- IOTimer: 0ns # Waktu I/O aktual membaca data dari sistem operasi.
- IndexLoadTime_V1: 0ns # Waktu yang dikonsumsi untuk membaca aliran indeks hanya dalam V1.
- NumSegmentFiltered: 0 # Jumlah segmen yang sepenuhnya difilter berdasarkan statistik kolom dan kondisi kueri.
- NumSegmentTotal: 6 # Jumlah semua segmen yang terlibat dalam kueri.
- RawRowsRead: 7 # Jumlah baris data sumber yang dibaca dari mesin penyimpanan. Untuk informasi lebih lanjut, lihat bagian berikut.
- RowsBitmapIndexFiltered: 0 # Jumlah baris yang difilter menggunakan indeks bitmap hanya dalam V2.
- RowsBloomFilterFiltered: 0 # Jumlah baris yang difilter menggunakan indeks BloomFilter hanya dalam V2.
- RowsKeyRangeFiltered: 0 # Jumlah baris yang difilter menggunakan indeks SortkeyIndex hanya dalam V2.
- RowsStatsFiltered: 0 # Jumlah baris yang difilter menggunakan indeks ZoneMap dalam V2, termasuk kondisi penghapusan. Jumlah baris yang difilter menggunakan indeks BloomFilter termasuk dalam V1.
- RowsConditionsFiltered: 0 # Jumlah baris yang difilter menggunakan berbagai indeks kolom hanya dalam V2.
- RowsVectorPredFiltered: 0 # Jumlah baris yang difilter menggunakan operasi penyaringan berdasarkan kondisi vektor.
- TotalPagesNum: 30 # Jumlah total halaman yang dibaca hanya dalam V2.
- UncompressedBytesRead: 0.00 # Ukuran file data yang dibaca setelah dekompresi dalam V1. Jika dekompresi tidak diperlukan, parameter ini menentukan ukuran file. Parameter ini menentukan ukuran halaman yang tidak mengenai cache halaman setelah dekompresi dalam V2. Jika dekompresi tidak diperlukan, parameter ini menentukan ukuran halaman.
- VectorPredEvalTime: 0ns # Waktu yang dikonsumsi untuk melakukan penyaringan berdasarkan kondisi vektor.
- ShortPredEvalTime: 0ns # Waktu yang dikonsumsi untuk melakukan penyaringan berdasarkan predikat jalur pendek.
- 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.
Pendorongan kondisi predikat dan penggunaan indeks dapat disimpulkan dari metrik terkait jumlah baris data dalam profil. Bagian berikut menjelaskan informasi profil selama pembacaan segmen dalam format V2. Makna metrik ini sedikit berbeda untuk segmen dalam format V1.
Fase Inisialisasi
Selama pembacaan segmen dalam format V2, jika kueri memiliki key_ranges (rentang kueri yang terdiri dari kunci awalan), data pertama-tama difilter menggunakan indeks SortkeyIndex. Jumlah baris yang difilter dicatat dalam
RowsKeyRangeFiltered.Penyaringan akurat dilakukan pada kolom dengan menggunakan indeks bitmap jika kondisi kueri berisi indeks bitmap. Jumlah baris yang difilter dicatat dalam
RowsBitmapIndexFiltered.Data difilter berdasarkan kondisi ekuivalen
(eq, in, dan is)dalam kondisi kueri menggunakan indeks BloomFilter. Jumlah baris yang difilter dicatat dalamRowsBloomFilterFiltered. NilaiRowsBloomFilterFilteredmenentukan perbedaan antara jumlah total baris dalam segmen (bukan jumlah baris yang difilter menggunakan indeks bitmap) dan jumlah baris tersisa setelah penyaringan menggunakan indeks BloomFilter. Akibatnya, data yang difilter menggunakan indeks BloomFilter mungkin tumpang tindih dengan data yang difilter menggunakan indeks bitmap.Data difilter menggunakan indeks ZoneMap berdasarkan kondisi kueri dan penghapusan. Jumlah baris yang difilter dicatat dalam
RowsStatsFiltered.Nilai
RowsConditionsFilteredmenentukan jumlah baris yang difilter menggunakan berbagai indeks, termasuk nilai-nilai dariRowsBloomFilterFiltereddanRowsStatsFiltered.
Fase Berikutnya
Jumlah baris yang difilter menggunakan kondisi penghapusan dalam fase berikutnya dicatat dalam
RowsDelFiltered. Jumlah baris yang sebenarnya difilter menggunakan kondisi penghapusan dicatat dalamRowsStatsFiltereddanRowsDelFiltered.RawRowsReadmenunjukkan jumlah baris yang dibaca setelah operasi penyaringan sebelumnya dilakukan.RowsReadmenunjukkan jumlah baris yang dikembalikan ke pemindai. Umumnya, nilaiRowsReadlebih kecil daripadaRawRowsRead, karena data yang dikembalikan dari mesin penyimpanan ke pemindai mungkin diagregasi. Jika selisih antaraRawRowsReaddanRowsReadlebih besar dari yang diharapkan, ini menunjukkan bahwa banyak baris diagregasi, yang dapat memakan waktu.RowsReturnedmenunjukkan jumlah baris yang akhirnya dikembalikan oleh ScanNode ke node induk. Secara umum, nilaiRowsReturnedjuga lebih kecil daripadaRowsRead. Beberapa kondisi predikat tidak didorong ke mesin penyimpanan pada pemindai, menunjukkan bahwa penyaringan telah dilakukan. Jika selisih antaraRowsReaddanRowsReturnedlebih besar dari yang diharapkan, ini menunjukkan bahwa banyak baris disaring pada pemindai. Hal ini mengindikasikan bahwa beberapa kondisi predikat dengan selektivitas tinggi tidak didorong ke mesin penyimpanan, sehingga efisiensi penyaringan pemindai lebih rendah daripada mesin penyimpanan.
Berdasarkan metrik-metrik tersebut, Anda dapat menganalisis secara kasar jumlah baris yang diproses oleh mesin penyimpanan serta jumlah baris dalam hasil akhir setelah penyaringan. Set metrik ini (Rows***Filtered) juga memungkinkan Anda menganalisis apakah kondisi kueri didorong ke mesin penyimpanan dan efektivitas penyaringan dari berbagai indeks.
Metrik Lainnya
Anda juga dapat melakukan analisis berdasarkan metrik-metrik berikut:
-
Metrik di bawah
OlapScanner, sepertiIOTimerdanBlockFetchTime, merupakan akumulasi dari semua metrik thread pemindai. Oleh karena itu, nilai metrik ini mungkin relatif besar. Thread pemindai membaca data secara asinkron, sehingga metrik akumulasi ini hanya mencerminkan waktu kerja kumulatif pemindai dan tidak dapat langsung menunjukkan waktu yang dikonsumsi oleh ScanNode. Proporsi waktu yang dikonsumsi oleh ScanNode dalam seluruh rencana eksekusi dicatat dalamActive. Dalam beberapa kasus, nilaiIOTimermencapai puluhan detik, sedangkan nilaiActivehanya beberapa detik. Berikut adalah kemungkinan penyebabnya:-
IOTimeradalah waktu kumulatif dari beberapa pemindai, dengan sejumlah besar pemindai tersedia. -
Node induk memakan waktu. Misalnya, node induk menghabiskan 100 detik, sedangkan ScanNode hanya menghabiskan 10 detik. Nilai parameter
Activemungkin hanya beberapa milidetik. Ketika node induk memproses data, ScanNode telah memindai data secara asinkron dan menyiapkan data. Dengan demikian, node induk dapat memperoleh data yang telah disiapkan dalam ScanNode, sehingga waktu aktifnya menjadi singkat.
-
-
NumScannersmenunjukkan jumlah tugas yang diajukan pemindai ke kolam thread, yang dijadwalkan oleh kolam thread dalamRuntimeState. Parameterdoris_scanner_thread_pool_thread_numdandoris_scanner_thread_pool_queue_sizemasing-masing menentukan ukuran dan panjang antrian kolam thread. Jika jumlah thread berlebihan atau tidak cukup, efisiensi kueri terpengaruh. Anda juga dapat membagi beberapa metrik dengan jumlah thread untuk memperkirakan waktu yang dikonsumsi oleh setiap thread. -
TabletCountmenunjukkan jumlah tablet yang harus dipindai. Jumlah tablet yang berlebihan menunjukkan bahwa banyak operasi pembacaan acak dan penggabungan data diperlukan. -
UncompressedBytesReadsecara tidak langsung mencerminkan ukuran data yang dibaca. Jika nilainya besar, banyak operasi I/O mungkin dilakukan. -
Anda dapat memeriksa hit cache halaman berdasarkan
CachedPagesNumdanTotalPagesNum. Rasio hit yang lebih tinggi menunjukkan bahwa operasi I/O dan dekompresi memakan waktu lebih sedikit.
Kolam buffer
Parameter | Deskripsi |
AllocTime | Waktu yang dikonsumsi untuk alokasi memori. |
CumulativeAllocationBytes | Ukuran alokasi memori kumulatif. |
CumulativeAllocations | Jumlah alokasi memori kumulatif. |
PeakReservation | Pemesanan puncak. |
PeakUnpinnedBytes | Ukuran data memori untuk unpining. |
PeakUsedReservation | Penggunaan memori reservasi. |
ReservationLimit | Batas reservasi dalam kolam buffer. |