All Products
Search
Document Center

ApsaraDB for SelectDB:Profil kueri

Last Updated:Mar 29, 2026

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;
Catatan Dengan enable_profile diatur ke true, SelectDB menghasilkan profil untuk setiap kueri yang dijalankan. Setiap profil mencatat detail eksekusi di seluruh node.

Lihat profil kueri

Penting

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.k1
Catatan Dalam respons HTTP API, bidang Query 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>"\G

Contoh 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>"\G

Contoh 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

Penting

Ekspor profil kueri memerlukan SelectDB Core V3.0.4 atau versi lebih baru.

Ekspor profil ke file untuk analisis offline atau berbagi.

  1. Aktifkan profil kueri.

    SET enable_profile=true;
  2. 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;
  3. Dapatkan ID profil.

    Versi SelectDB 4.0.x

    Kirim permintaan HTTP untuk mendapatkan informasi kueri. Bidang Query ID dalam 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()             |
    +-----------------------------------+-----------+---------------------+---------------------+-------+------------+-------+------------------------------------+-------------------------------+
  4. Ekspor profil menggunakan ID-nya.

    PlaceholderDeskripsiDefault
    <userName>Username untuk mengakses instans SelectDB
    <userPassword>Password untuk mengakses instans SelectDB
    <selectdbAddress>Endpoint instans SelectDB
    <httpPort>Nomor port HTTP8080
    <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.txt

    Ganti placeholder berikut dengan nilai aktual Anda:

  5. (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

ParameterDeskripsi
AverageThreadTokensJumlah thread yang digunakan untuk eksekusi fragment, tidak termasuk penggunaan kolam thread.
Buffer Pool PeakReservationPenggunaan memori puncak kolam buffer.
MemoryLimitBatas memori untuk kueri.
PeakMemoryUsagePenggunaan memori puncak suatu unit eksekusi selama kueri.
RowsProducedJumlah baris yang kolomnya diproses.

BlockMgr

ParameterDeskripsi
BlocksCreatedJumlah blok yang dibuat oleh BlockManager.
BlocksRecycledJumlah blok yang digunakan ulang.
BytesWrittenUkuran total data yang ditulis ke disk.
MaxBlockSizeUkuran satu blok.
TotalReadBlockTimeWaktu total yang dikonsumsi untuk membaca blok.

DataStreamSender

ParameterDeskripsi
BytesSentUkuran total data yang dikirim. Dihitung sebagai: jumlah penerima x ukuran data yang dikirim.
IgnoreRowsJumlah baris yang difilter.
LocalBytesSentUkuran data yang dikirim oleh node lokal dan diterima oleh node lokal selama pertukaran data.
OverallThroughputThroughput total. Dihitung sebagai: BytesSent / waktu eksekusi.
SerializeBatchTimeWaktu yang dikonsumsi untuk serialisasi data yang dikirim.
UncompressedRowBatchSizeUkuran data RowBatch yang dikirim sebelum kompresi.

ODBC_TABLE_SINK

ParameterDeskripsi
NumSentRowsJumlah total baris yang ditulis ke tabel eksternal.
TupleConvertTimeWaktu yang dikonsumsi untuk serialisasi data yang dikirim menjadi pernyataan INSERT.
ResultSendTimeWaktu yang dikonsumsi untuk menulis data menggunakan driver Open Database Connectivity (ODBC).

EXCHANGE_NODE

ParameterDeskripsi
BytesReceivedUkuran data yang diterima melalui jaringan.
MergeGetNextJika pengurutan dilakukan pada node anak, node exchange melakukan penggabungan dan pengurutan terpadu. Ini adalah waktu total untuk penggabungan dan pengurutan tersebut, termasuk MergeGetNextBatch.
MergeGetNextBatchWaktu 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.
ChildMergeGetNextKetika 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.
ChildMergeGetNextBatchWaktu yang dikonsumsi untuk node merge anak mengambil data. Nilai tinggi dapat mengindikasikan bottleneck pada node pengirim data anak.
DataArrivalWaitTimeWaktu total menunggu pengirim mengirim data.
FirstBatchArrivalWaitTimeWaktu menunggu batch data pertama dari pengirim.
DeserializeRowBatchTimerWaktu yang dikonsumsi untuk deserialisasi data jaringan.
SendersBlockedTotalTimer(*)Waktu tunggu total di sisi pengirim ketika memori antrian DataStreamRecv telah penuh.
ConvertRowBatchTimeWaktu yang dikonsumsi untuk mengonversi data yang diterima menjadi RowBatch.
RowsReturnedJumlah baris yang diterima.
RowsReturnedRateLaju penerimaan baris.

SORT_NODE

ParameterDeskripsi
InMemorySortTimeWaktu yang dikonsumsi untuk pengurutan dalam memori.
InitialRunsCreatedJumlah kali pengurutan diinisialisasi. Nilainya 1 untuk pengurutan dalam memori.
SortDataSizeUkuran total data yang diurutkan.
MergeGetNextWaktu yang dikonsumsi oleh MergeSort untuk mendapatkan batch berikutnya dari beberapa run yang telah diurutkan. Diukur hanya ketika data ditulis ke disk.
MergeGetNextBatchWaktu yang dikonsumsi oleh MergeSort untuk mengekstraksi batch dari run yang diurutkan berikutnya. Diukur hanya ketika data ditulis ke disk.
TotalMergesPerformedJumlah kali penggabungan eksternal dilakukan.

AGGREGATION_NODE

ParameterDeskripsi
PartitionsCreatedJumlah partisi untuk pemisahan kueri agregat.
GetResultsTimeWaktu yang dikonsumsi untuk mendapatkan hasil agregasi dari partisi.
HTResizeTimeWaktu yang dikonsumsi untuk mengubah ukuran tabel hash.
HTResizeJumlah kali tabel hash diubah ukurannya.
HashBucketsJumlah bucket dalam tabel hash.
HashBucketsWithDuplicateJumlah bucket dengan node duplikat dalam tabel hash.
HashCollisionsJumlah tabrakan hash dalam tabel hash.
HashDuplicateNodesJumlah node duplikat yang termasuk dalam bucket yang sama dalam tabel hash.
HashFailedProbeJumlah operasi probe yang gagal pada tabel hash.
HashFilledBucketsJumlah bucket yang diisi data dalam tabel hash.
HashProbeJumlah kali tabel hash di-query.
HashTravelLengthJumlah langkah yang ditempuh selama query tabel hash.

HASH_JOIN_NODE

ParameterDeskripsi
ExecOptionMetode pembangunan tabel hash untuk node anak kanan: sinkron atau asinkron.
BuildBucketsJumlah bucket dalam tabel hash.
BuildRowsJumlah baris dalam tabel hash.
BuildTimeWaktu yang dikonsumsi untuk membangun tabel hash.
LoadFactorFaktor beban tabel hash, yang menunjukkan jumlah bucket tidak kosong.
ProbeRowsJumlah baris tempat operasi probe hash dilakukan setelah melintasi node anak kiri.
ProbeTimeWaktu yang dikonsumsi untuk melintasi node anak kiri untuk probe hash, tidak termasuk waktu untuk memanggil GetNext pada RowBatch dari node anak kiri.
PushDownComputeTimeWaktu yang dikonsumsi untuk menghitung kondisi penurunan predikat.
PushDownTimeWaktu 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

ParameterDeskripsi
ExecOptionMetode pembangunan RowBatchList untuk node anak kanan: sinkron atau asinkron.
BuildRowsJumlah baris RowBatchList (baris dalam node anak kanan).
BuildTimeWaktu yang dikonsumsi untuk membangun RowBatchList.
LeftChildRowsJumlah baris dalam node anak kiri.
LeftChildTimeWaktu 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

ParameterDeskripsi
MaterializeExprsEvaluateTimeWaktu yang dikonsumsi untuk mengevaluasi ekspresi konversi tipe dan materialisasi hasil ketika tipe bidang berbeda di kedua sisi UNION.

ANALYTIC_EVAL_NODE

ParameterDeskripsi
EvaluationTimeWaktu total yang dikonsumsi untuk komputasi fungsi analitik (fungsi jendela).
GetNewBlockTimeWaktu yang dikonsumsi untuk mengalokasikan blok baru selama inisialisasi. Blok ini menyimpan jendela Baris atau seluruh partisi untuk komputasi fungsi analitik.
PinTimeWaktu yang dikonsumsi untuk mengalokasikan blok baru atau membaca ulang blok yang ditulis ke disk kembali ke memori.
UnpinTimeWaktu 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.

Catatan Beberapa nilai metrik berbeda tergantung pada format penyimpanan (V1 atau V2).

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:

  1. SortkeyIndex — Jika kueri memiliki rentang kunci (rentang kunci awalan), data difilter terlebih dahulu. Baris yang dieliminasi dicatat dalam RowsKeyRangeFiltered.

  2. Indeks bitmap — Filtering akurat kolom diterapkan untuk kondisi yang cocok dengan indeks bitmap. Baris yang dieliminasi dicatat dalam RowsBitmapIndexFiltered.

  3. Indeks BloomFilter — Kondisi kesetaraan (=, IN, IS) difilter menggunakan indeks BloomFilter. Baris yang dieliminasi dicatat dalam RowsBloomFilterFiltered.

    Catatan RowsBloomFilterFiltered dihitung sebagai total baris segmen dikurangi baris yang tersisa setelah filtering BloomFilter. Nilai ini dapat tumpang tindih dengan baris yang sudah dieliminasi oleh indeks bitmap.
  4. Indeks ZoneMap — Data difilter berdasarkan kondisi kueri dan penghapusan. Baris yang dieliminasi dicatat dalam RowsStatsFiltered.

  5. RowsConditionsFiltered adalah total baris yang difilter oleh semua indeks gabungan, termasuk RowsBloomFilterFiltered dan RowsStatsFiltered.

Fase berikutnya

Setelah inisialisasi, data yang tersisa melewati tahapan tambahan:

  • RowsDelFiltered: Baris yang dieliminasi oleh kondisi penghapusan. Baris ini juga dihitung dalam RowsStatsFiltered.

  • RawRowsRead: Baris yang tersisa setelah semua filtering sebelumnya.

  • RowsRead: Baris yang dikembalikan dari mesin penyimpanan ke pemindai. Biasanya kurang dari RawRowsRead karena mesin penyimpanan dapat mengagregasi baris. Selisih besar antara RawRowsRead dan RowsRead mengindikasikan agregasi berat, yang bisa menjadi masalah performa.

  • RowsReturned: Baris yang akhirnya dikembalikan oleh ScanNode ke node induk. Biasanya kurang dari RowsRead karena predikat yang tidak didorong ke mesin penyimpanan diterapkan di tingkat pemindai. Selisih besar antara RowsRead dan RowsReturned berarti 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 — seperti IOTimer dan BlockFetchTime — 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. Persentase Active mencatat proporsi aktual waktu yang dikontribusikan ScanNode terhadap rencana eksekusi keseluruhan. Wajar jika nilai IOTimer mencapai puluhan detik, sementara nilai Active hanya beberapa detik, karena dua alasan berikut:

    • IOTimer terakumulasi 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 Active ScanNode menjadi singkat.

  • NumScanners adalah jumlah tugas yang dikirimkan pemindai ke kolam thread, yang dikelola oleh RuntimeState. Parameter doris_scanner_thread_pool_thread_num dan doris_scanner_thread_pool_queue_size mengontrol 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.

  • TabletCount adalah jumlah tablet yang dipindai. Jumlah tablet tinggi berarti lebih banyak pembacaan acak dan operasi penggabungan data.

  • UncompressedBytesRead mencerminkan volume data yang dibaca. Nilai tinggi dapat mengindikasikan beban I/O berat.

  • Bandingkan CachedPagesNum dengan TotalPagesNum untuk menilai tingkat hit cache halaman. Tingkat hit yang lebih tinggi mengurangi overhead I/O dan dekompresi.

Buffer pool

ParameterDeskripsi
AllocTimeWaktu yang dikonsumsi untuk alokasi memori.
CumulativeAllocationBytesUkuran kumulatif memori yang dialokasikan.
CumulativeAllocationsJumlah kumulatif alokasi memori.
PeakReservationUkuran reservasi puncak.
PeakUnpinnedBytesUkuran data memori yang tidak dipin.
PeakUsedReservationPenggunaan memori dari reservasi.
ReservationLimitBatas reservasi dalam buffer pool.

Langkah selanjutnya