全部产品
Search
文档中心

ApsaraDB for SelectDB:Profil Kueri

更新时间:Jul 30, 2025

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;
Catatan
  • 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:

Penting

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.

Catatan

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.k1

Gunakan profil kueri

Ikuti langkah-langkah berikut untuk mengatasi masalah hambatan kinerja pada pernyataan kueri SQL:

  1. 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)
  2. 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    |
    +-----------------------------------+-------------------+------------+ 
  3. 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:

Penting

Hanya instans SelectDB yang menjalankan SelectDB Core V3.0.4 atau lebih baru yang mendukung fitur ini.

  1. Aktifkan fitur profil kueri.

    SET enable_profile=true;
  2. 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;
  3. 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 ID menunjukkan ID 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  
    }
  4. 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.txt

    Parameter

    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.

  5. Opsional. Jika Anda menggunakan simbol pengalihan untuk mengekspor profil ke file, format konten dapat diatur agar lebih mudah dibaca.

    sudo sed -r 's/\\n/\n/g' res.txt | sed -r 's/\\t/\t/g' > new.txt

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

  1. 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.

  2. Penyaringan akurat dilakukan pada kolom dengan menggunakan indeks bitmap jika kondisi kueri berisi indeks bitmap. Jumlah baris yang difilter dicatat dalam RowsBitmapIndexFiltered.

  3. Data difilter berdasarkan kondisi ekuivalen (eq, in, dan is) dalam kondisi kueri menggunakan indeks BloomFilter. Jumlah baris yang difilter dicatat dalam RowsBloomFilterFiltered. Nilai RowsBloomFilterFiltered menentukan 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.

  4. Data difilter menggunakan indeks ZoneMap berdasarkan kondisi kueri dan penghapusan. Jumlah baris yang difilter dicatat dalam RowsStatsFiltered.

  5. Nilai RowsConditionsFiltered menentukan jumlah baris yang difilter menggunakan berbagai indeks, termasuk nilai-nilai dari RowsBloomFilterFiltered dan RowsStatsFiltered.

Fase Berikutnya

  • Jumlah baris yang difilter menggunakan kondisi penghapusan dalam fase berikutnya dicatat dalam RowsDelFiltered. Jumlah baris yang sebenarnya difilter menggunakan kondisi penghapusan dicatat dalam RowsStatsFiltered dan RowsDelFiltered.

  • RawRowsRead menunjukkan jumlah baris yang dibaca setelah operasi penyaringan sebelumnya dilakukan.

  • RowsRead menunjukkan jumlah baris yang dikembalikan ke pemindai. Umumnya, nilai RowsRead lebih kecil daripada RawRowsRead, karena data yang dikembalikan dari mesin penyimpanan ke pemindai mungkin diagregasi. Jika selisih antara RawRowsRead dan RowsRead lebih besar dari yang diharapkan, ini menunjukkan bahwa banyak baris diagregasi, yang dapat memakan waktu.

  • RowsReturned menunjukkan jumlah baris yang akhirnya dikembalikan oleh ScanNode ke node induk. Secara umum, nilai RowsReturned juga lebih kecil daripada RowsRead. Beberapa kondisi predikat tidak didorong ke mesin penyimpanan pada pemindai, menunjukkan bahwa penyaringan telah dilakukan. Jika selisih antara RowsRead dan RowsReturned lebih 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, seperti IOTimer dan BlockFetchTime, 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 dalam Active. Dalam beberapa kasus, nilai IOTimer mencapai puluhan detik, sedangkan nilai Active hanya beberapa detik. Berikut adalah kemungkinan penyebabnya:

    • IOTimer adalah 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 Active mungkin 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.

  • NumScanners menunjukkan jumlah tugas yang diajukan pemindai ke kolam thread, yang dijadwalkan oleh kolam thread dalam RuntimeState. Parameter doris_scanner_thread_pool_thread_num dan doris_scanner_thread_pool_queue_size masing-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.

  • TabletCount menunjukkan jumlah tablet yang harus dipindai. Jumlah tablet yang berlebihan menunjukkan bahwa banyak operasi pembacaan acak dan penggabungan data diperlukan.

  • UncompressedBytesRead secara tidak langsung mencerminkan ukuran data yang dibaca. Jika nilainya besar, banyak operasi I/O mungkin dilakukan.

  • Anda dapat memeriksa hit cache halaman berdasarkan CachedPagesNum dan TotalPagesNum. 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.