All Products
Search
Document Center

E-MapReduce:Studi kasus diagnostik dan optimasi kinerja Query Profile

Last Updated:Sep 15, 2026

Query Profile mencatat detail eksekusi suatu kueri di instans StarRocks Anda. Gunakan Query Profile untuk mendiagnosis kinerja kueri, mengidentifikasi bottleneck, dan memilih teknik optimasi yang sesuai guna mengatasinya.

Ikhtisar Query Profile

Visualisasi Query Profile

StarRocks Manager mendukung analitik visual untuk Query Profile. Untuk informasi selengkapnya, lihat Pengenalan Query Profile.

Identifikasi bottleneck kueri

Dalam visualisasi Query Profile di StarRocks Manager, operator yang memerlukan waktu lebih lama untuk dijalankan ditampilkan dengan warna lebih gelap. Tiga operator dengan durasi eksekusi terpanjang disorot sehingga bottleneck kueri mudah diidentifikasi.Operator execution duration in the Query Profile

Mengapa waktu CONNECTOR_SCAN lebih lama daripada SCANTIME?

CONNECTOR_SCAN merepresentasikan waktu aktif kumulatif suatu operator di seluruh instans paralelnya. Nilai ini mencakup SCANTIME, IOTaskExecTime, OperatorTotalTime, dan komponen lainnya. Akibatnya, nilai CONNECTOR_SCAN dapat lebih besar secara numerik dibandingkan SCANTIME dari satu instans tunggal.

Studi kasus optimasi

Bagian berikut menjelaskan cara mendiagnosis dan mengatasi masalah umum kinerja kueri di StarRocks:

Optimalkan kueri field besar yang menyebabkan error out-of-memory (OOM)

Saat Anda melakukan kueri pada tabel yang berisi field besar seperti TEXT atau VARCHAR, membaca atau menghitung terlalu banyak data field besar dapat menyebabkan error out-of-memory (OOM). Untuk error batas memori yang disebabkan oleh kesenjangan data, lihat Langkah-langkah optimasi untuk error batas memori (Memory of process exceed limit) yang disebabkan oleh kesenjangan data. Terapkan langkah-langkah berikut untuk mengurangi konsumsi memori:

  • Hindari SELECT *. Secara eksplisit tentukan hanya kolom yang Anda butuhkan untuk mengurangi volume data yang dipindai dan dimuat ke dalam memori.

  • Jauhkan field besar dari operasi agregasi seperti GROUP BY dan DISTINCT guna mencegah pembentukan hasil antara yang terlalu besar.

  • Aktifkan fitur spill to disk untuk mengurangi tekanan memori dengan mengatur variabel sesi enable_spill=true.

  • Optimalkan skema tabel dengan memindahkan field teks besar ke tabel terpisah, dan simpan hanya indeks serta field kecil di tabel utama. Pendekatan pemisahan tabel ini tidak berlaku dalam skenario agregasi.

Indeks Bitmap

Indeks Bitmap adalah jenis khusus indeks database yang menggunakan larik bit. Setiap bit dalam larik tersebut berkorespondensi dengan satu baris di tabel data. Nilai bit tersebut, yaitu 0 atau 1, ditentukan oleh nilai baris yang bersesuaian.

  • Gunakan indeks Bitmap untuk meningkatkan kinerja kueri pada kolom yang memiliki kardinalitas rendah dan banyak nilai berulang, seperti kolom gender.

  • Untuk memeriksa apakah kueri mengenai indeks Bitmap, lihat bidang BitmapIndexFilterRows di Query Profile.

Buat indeks

  • Buat indeks Bitmap saat Anda membuat tabel.

CREATE TABLE `student_info` (
  `s_stukey` bigint(20) NULL COMMENT "",
  `s_name` varchar(65533) NULL COMMENT "",
  `s_gender` varchar(65533) NULL COMMENT "",
  INDEX index1 (s_gender) USING BITMAP COMMENT 'index1'
) ENGINE=OLAP
DUPLICATE KEY(`s_stukey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`s_stukey`);
INSERT INTO student_info
VALUES
    (001,'student#000000019','male'),
    (002,'student#000000020','male'),
    (003,'student#000000021','male'),
    (004,'student#000000022','female');
  • Buat indeks Bitmap pada tabel yang sudah ada dengan menggunakan CREATE INDEX.

CREATE INDEX index_name ON table_name (column_name) [USING BITMAP] [COMMENT ''];

Periksa progres pembuatan indeks

Jalankan perintah berikut untuk memeriksa progres tugas pembuatan indeks:

SHOW ALTER TABLE COLUMN [FROM db_name];

Lihat indeks

Jalankan perintah berikut untuk melihat indeks pada suatu tabel:

SHOW {INDEX[ES] | KEY[S] } FROM [db_name.]table_name [FROM db_name];

Output berikut dikembalikan:

MySQL [db_test]> show index from student_info;
+------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table                  | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| db_test.student_info   |            | index1   |              | s_gender    |           |             |          |        |      | BITMAP     | index1  |
+------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
1 row in set (0.01 sec)

Hapus indeks

Jalankan perintah berikut untuk menghapus indeks:

DROP INDEX index_name ON [db_name.]table_name;

Uji kueri kolom tunggal

  1. Jalankan kueri yang memfilter kolom s_gender.

    select * from student_info where s_gender='male';
  2. Lihat Profil.

    Klik OLAP_SCAN, lalu klik tab Node Details di sebelah kanan. Filter metrik untuk Bitmap guna memastikan bahwa indeks Bitmap telah berlaku.Bitmap index metrics in the Query Profile

Indeks Bloom filter

Indeks Bloom filter secara cepat menentukan apakah suatu file data berisi data target. Jika tidak, file tersebut dilewati, sehingga mengurangi volume data yang dipindai. Bloom filter hemat ruang dan cocok untuk kolom dengan kardinalitas tinggi, seperti kolom ID.

  • Pada model Primary Key dan Duplicate, Anda dapat membuat indeks Bloom filter pada kolom apa pun. Pada model Aggregate dan Update, Anda hanya dapat membuat indeks Bloom filter pada kolom kunci.

  • Indeks Bloom filter tidak didukung untuk kolom dengan tipe data TINYINT, FLOAT, DOUBLE, atau DECIMAL.

  • Indeks Bloom filter hanya meningkatkan kinerja untuk kueri yang mengandung predikat in atau =, seperti SELECT ... WHERE ... IN () dan SELECT ... WHERE column = ....

  • Untuk memeriksa apakah kueri mengenai indeks Bloom filter, lihat bidang BloomFilterFilterRows di Query Profile.

Buat indeks

Saat membuat tabel, Anda dapat membuat indeks Bloom filter dengan menentukan bloom_filter_columns dalam klausa PROPERTIES. Contoh berikut menunjukkan cara melakukannya.

CREATE TABLE table1
(
  k1 BIGINT,
  k2 LARGEINT,
  v1 VARCHAR(2048) REPLACE,
  v2 SMALLINT DEFAULT "10"
)
ENGINE = olap
PRIMARY KEY(k1, k2)
DISTRIBUTED BY HASH (k1, k2) BUCKETS 10
PROPERTIES("bloom_filter_columns" = "k1,k2"); -- Pisahkan beberapa kolom indeks dengan koma (,).

Lihat indeks

Jalankan perintah berikut untuk melihat indeks pada suatu tabel:

SHOW CREATE TABLE table1;

Ubah indeks

Contohnya:

  • Tambahkan indeks Bloom filter untuk kolom v1.

ALTER TABLE table1 SET ("bloom_filter_columns" = "k1,k2,v1");
  • Hapus indeks Bloom filter untuk kolom k2.

ALTER TABLE table1 SET ("bloom_filter_columns" = "k1");
  • Hapus semua indeks Bloom filter dari table1.

ALTER TABLE table1 SET ("bloom_filter_columns" = "");

Contoh

  1. Ambil tabel customer dari TPC-H sebagai contoh. Tambahkan indeks Bloom filter pada kolom kardinalitas tinggi yang bukan kunci pengurutan, seperti kolom c_phone.

    ALTER TABLE tpc_h_sf100.customer SET ("bloom_filter_columns" = "c_custkey, c_phone");
  2. Lihat indeks untuk memastikan bahwa indeks Bloom filter telah ditambahkan.

    SHOW CREATE TABLE tpc_h_sf100.customer;
    | customer | CREATE TABLE `customer` (
      `c_custkey` bigint(20) NULL COMMENT "",
      `c_name` varchar(65533) NULL COMMENT "",
      `c_address` varchar(65533) NULL COMMENT "",
      `c_nationkey` bigint(20) NULL COMMENT "",
      `c_phone` varchar(65533) NULL COMMENT "",
      `c_acctbal` double NULL COMMENT "",
      `c_mktsegment` varchar(65533) NULL COMMENT "",
      `c_comment` varchar(65533) NULL COMMENT "",
      `Gender` varchar(65533) NULL DEFAULT "default_value" COMMENT ""
    ) ENGINE=OLAP
    DUPLICATE KEY(`c_custkey`)
    COMMENT "OLAP"
    DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 24
    PROPERTIES (
    "replication_num" = "1",
    "bloom_filter_columns" = "c_custkey, c_phone",
    "in_memory" = "false",
    "storage_format" = "DEFAULT",
    "enable_persistent_index" = "false",
    "compression" = "LZ4"
    ); |
  3. Jalankan kueri yang memfilter kolom c_phone.

    select * from tpc_h_sf100.customer where c_phone = "10-334-921-5346";
  4. Lihat Profil.

    Klik OLAP_SCAN, lalu klik tab Node Details di sebelah kanan. Temukan metrik BloomFilterFilterRows untuk memastikan bahwa indeks Bloom filter aktif.Bloom filter index metrics in the Query Profile

Optimalkan untuk kesenjangan data

Contoh ini menggunakan tabel lineitem dari TPC-H dan memilih kolom dengan distribusi nilai tidak merata sebagai kunci bucketing untuk menunjukkan masalah kesenjangan data. Dalam contoh ini, kolom l_tag memiliki nilai yang sama di setiap baris, sehingga menghasilkan kesenjangan data ekstrem.

  1. Buat data uji. Tambahkan kolom baru ke tabel lineitem dari TPC-H untuk digunakan sebagai kunci distribusi.

    CREATE TABLE `lineitem_tag` (
      `l_orderkey` bigint(20) NULL COMMENT "",
      `l_partkey` bigint(20) NULL COMMENT "",
      `l_suppkey` bigint(20) NULL COMMENT "",
      `l_linenumber` int(11) NULL COMMENT "",
      `l_quantity` double NULL COMMENT "",
      `l_extendedprice` double NULL COMMENT "",
      `l_discount` double NULL COMMENT "",
      `l_tax` double NULL COMMENT "",
      `l_returnflag` varchar(65533) NULL COMMENT "",
      `l_linestatus` varchar(65533) NULL COMMENT "",
      `l_shipdate` date NULL COMMENT "",
      `l_commitdate` date NULL COMMENT "",
      `l_receiptdate` date NULL COMMENT "",
      `l_shipinstruct` varchar(65533) NULL COMMENT "",
      `l_shipmode` varchar(65533) NULL COMMENT "",
      `l_comment` varchar(65533) NULL COMMENT "",
      `l_tag` varchar(65533)  default 'false' COMMENT ""
    ) ENGINE=OLAP
    DUPLICATE KEY(`l_orderkey`)
    COMMENT "OLAP"
    DISTRIBUTED BY HASH(`l_tag`) BUCKETS 96
    PROPERTIES (
    "replication_num" = "1",
    "in_memory" = "false",
    "storage_format" = "DEFAULT",
    "enable_persistent_index" = "false"
    );
    insert into lineitem_tag  select *, 'false' as l_tag  from tpc_h_sf100.lineitem;
  2. Jalankan kueri untuk melakukan pemindaian tabel penuh.

    select count(1) from lineitem_tag;
  3. Lihat Profil.

    Klik OLAP_SCAN dan buka tab Node di sebelah kanan. Bandingkan waktu SCAN di bawah MaxTime dan MinTime. Jika waktu tersebut berbeda hingga beberapa orde besaran, kemungkinan besar telah terjadi kesenjangan data.Data skew in the Query Profile

  4. Optimalkan skema tabel dengan mendefinisikan ulang kunci distribusi. Buat tabel baru bernama lineitem2 dan ubah kunci bucketing dari l_tag menjadi l_orderkey untuk mengatasi kesenjangan data. Pernyataan berikut membuat tabel tersebut, di mana perubahan pentingnya adalah DISTRIBUTED BY HASH(`l_orderkey`) BUCKETS 96.

    CREATE TABLE `lineitem2` (
      `l_orderkey` bigint(20) NULL COMMENT "",
      `l_partkey` bigint(20) NULL COMMENT "",
      `l_suppkey` bigint(20) NULL COMMENT "",
      `l_linenumber` int(11) NULL COMMENT "",
      `l_quantity` double NULL COMMENT "",
      `l_extendedprice` double NULL COMMENT "",
      `l_discount` double NULL COMMENT "",
      `l_tax` double NULL COMMENT "",
      `l_returnflag` varchar(65533) NULL COMMENT "",
      `l_linestatus` varchar(65533) NULL COMMENT "",
      `l_shipdate` date NULL COMMENT "",
      `l_commitdate` date NULL COMMENT "",
      `l_receiptdate` date NULL COMMENT "",
      `l_shipinstruct` varchar(65533) NULL COMMENT "",
      `l_shipmode` varchar(65533) NULL COMMENT "",
      `l_comment` varchar(65533) NULL COMMENT "",
      `l_tag` varchar(65533) NULL DEFAULT "default_value" COMMENT ""
    ) ENGINE=OLAP
    DUPLICATE KEY(`l_orderkey`)
    COMMENT "OLAP"
    DISTRIBUTED BY HASH(`l_orderkey`) BUCKETS 96
    PROPERTIES (
    "replication_num" = "1",
    "bloom_filter_columns" = "l_orderkey",
    "in_memory" = "false",
    "storage_format" = "DEFAULT",
    "enable_persistent_index" = "false",
    "compression" = "LZ4"
    );
  5. Lihat Profil lagi. Bandingkan waktu SCAN di bawah MaxTime dan MinTime. Anda dapat melihat bahwa masalah kesenjangan data telah dikurangi.Query Profile after the bucketing key change

Langkah-langkah optimasi untuk error batas memori (Memory of process exceed limit) yang disebabkan oleh kesenjangan data

Kesenjangan data juga dapat menyebabkan kueri gagal dengan error Memory of process exceed limit. Untuk error OOM yang disebabkan oleh field besar, lihat Optimalkan kueri field besar yang menyebabkan error out-of-memory (OOM). Jika Anda mengalami error batas memori akibat kesenjangan data, coba optimasi berikut selain mengubah kunci bucketing:

  • Optimalkan strategi bucketing: Gunakan kolom kardinalitas tinggi sebagai kunci bucketing, gabungkan beberapa kolom untuk bucketing, atau terapkan salting atau bucketing acak pada nilai panas.

  • Sesuaikan strategi eksekusi JOIN: Gunakan Broadcast Join saat menggabungkan tabel kecil dengan tabel besar. Saat menggabungkan dua tabel besar, pastikan kunci gabungan tersebar merata, atau gunakan DISTRIBUTE BY untuk mendistribusikan ulang data.

  • Sesuaikan dan optimalkan parameter resource secara dinamis: Ubah metode bucketing tabel yang ada, tingkatkan parameter eksekusi konkuren BE seperti parallel_fragment_exec_instance_num, atau tambahkan lebih banyak node BE atau replika untuk menyebarkan beban.

Tampilan yang di-materialisasi tabel tunggal

Tampilan yang di-materialisasi tabel tunggal (juga dikenal sebagai Rollup) di StarRocks adalah jenis khusus indeks yang tidak dapat dikueri secara langsung. Jika gudang data Anda berisi banyak kueri kompleks atau berulang, Anda dapat membuat tampilan yang di-materialisasi tabel tunggal untuk mempercepatnya.

Uji kueri

  1. Ambil tabel lineitem dari TPC-H sebagai contoh dan jalankan kueri.

    select l_returnflag,l_linestatus,l_shipmode,sum(l_extendedprice) from lineitem group by l_returnflag,l_linestatus,l_shipmode;
  2. Kueri awal membutuhkan waktu 1.115 ms untuk diselesaikan karena belum ada tampilan yang di-materialisasi.Query duration before the materialized view is created

  3. Lihat Profil.

    Klik OLAP_SCAN dan buka tab Node di sebelah kanan. Anda dapat melihat bahwa Rollup memindai tabel lineitem itu sendiri.Rollup in the Query Profile

Buat tampilan yang di-materialisasi

Jalankan perintah berikut untuk membuat tampilan yang di-materialisasi tabel tunggal:

CREATE MATERIALIZED VIEW material_test AS select l_returnflag,l_linestatus ,l_shipmode,sum(l_extendedprice) from lineitem group by l_returnflag,l_linestatus,l_shipmode;

Verifikasi keberhasilan penggunaan tampilan yang di-materialisasi

  1. Gunakan perintah EXPLAIN untuk memeriksa apakah kueri mengenai tampilan yang di-materialisasi tabel tunggal.

    explain select l_returnflag,l_linestatus ,l_shipmode,sum(l_extendedprice) from lineitem group by l_returnflag,l_linestatus,l_shipmode;

    Dalam hasil yang dikembalikan, rollup: material_test menunjukkan bahwa kueri mengenai tampilan yang di-materialisasi bernama material_test.

    0:OlapScanNode
         TABLE: lineitem
         PREAGGREGATION: OFF. Reason: null
         partitions=1/1
         rollup: material_test
         tabletRatio=96/96
         tabletList=15646,15648,15650,15652,15654,15656,15658,15660,15662,15664 ...
         cardinality=600037902
         avgRowSize=14.285666
         numNodes=0
  2. Lihat Profil.

    Klik OLAP_SCAN. Di tab Node di sebelah kanan, Anda dapat melihat bahwa kueri mengenai tampilan yang di-materialisasi dan waktu kueri berkurang menjadi 0,05 ms.Materialized view hit in the Query Profile

Verifikasi apakah JoinRuntimeFilter aktif

Saat tabel kanan dalam operasi JOIN membangun tabel hash, Runtime Filter dibuat. Filter ini dikirim ke sisi kiri pohon kueri dan didorong ke operator scan bila memungkinkan. Anda dapat melihat metrik terkait JoinRuntimeFilter di tab Node Details operator scan.

  1. Ambil query72.sql dari TPC-DS sebagai contoh.

    select i_item_desc,
           w_warehouse_name,
           d1.d_week_seq,
           sum(case when p_promo_sk is null then 1 else 0 end) no_promo,
           sum(case when p_promo_sk is not null then 1 else 0 end) promo,
           count(*) total_cnt
     from inventory
     join catalog_sales on (cs_item_sk = inv_item_sk)
     join warehouse on (w_warehouse_sk=inv_warehouse_sk)
     join item on (i_item_sk = cs_item_sk)
     join customer_demographics on (cs_bill_cdemo_sk = cd_demo_sk)
     join household_demographics on (cs_bill_hdemo_sk = hd_demo_sk)
     join date_dim d1 on (cs_sold_date_sk = d1.d_date_sk)
     join date_dim d2 on (inv_date_sk = d2.d_date_sk)
     join date_dim d3 on (cs_ship_date_sk = d3.d_date_sk)
     left outer join promotion on (cs_promo_sk=p_promo_sk)
     left outer join catalog_returns on (cr_item_sk = cs_item_sk and cr_order_number = cs_order_number)
     where d1.d_week_seq = d2.d_week_seq
       and inv_quantity_on_hand < cs_quantity
       and d3.d_date > (cast(d1.d_date AS DATE) + interval '5' day)
       and hd_buy_potential = '>10000'
       and d1.d_year = 1999
       and cd_marital_status = 'D'
     group by i_item_desc,w_warehouse_name,d1.d_week_seq
     order by total_cnt desc, i_item_desc, w_warehouse_name, d1.d_week_seq
     limit 100;
  2. Lihat Profil.

    Klik OLAP_SCAN, lalu klik tab Node Details di sebelah kanan. Anda dapat melihat bahwa JoinRuntimeFilter dipicu saat operator scan memindai tabel inventory.JoinRuntimeFilter metrics in the Query Profile

Colocate Join

Untuk menggunakan Colocate Join di StarRocks, tetapkan tabel ke Colocation Group (CG) saat Anda membuatnya. Tabel dalam CG yang sama harus mengikuti Colocation Group Schema (CGS) yang sama agar datanya didistribusikan di set node BE yang sama. Saat kolom gabungan juga merupakan kunci bucketing, node komputasi hanya perlu melakukan join lokal, sehingga mengurangi waktu transfer data antar node. Berbeda dengan Shuffle Join atau Broadcast Join, Colocate Join menghindari transfer data jaringan dan meningkatkan kinerja kueri.

Buat tabel colocated

Catatan

StarRocks hanya mendukung operasi Colocate Join pada tabel dalam database yang sama.

Jalankan pernyataan berikut untuk membuat tabel dalam Colocation Group:

CREATE TABLE tbl (k1 int, v1 int sum)
DISTRIBUTED BY HASH(k1)
BUCKETS 8
PROPERTIES(
    "colocate_with" = "group1"
);

Penghapusan otomatis Colocation Group

Saat tabel terakhir dalam suatu Grup dihapus secara permanen, Grup tersebut juga secara otomatis dihapus. Penghapusan permanen berarti tabel dihapus dari Recycle Bin. Setelah Anda menghapus tabel menggunakan perintah DROP TABLE, tabel tersebut tetap berada di Recycle Bin selama satu hari secara default sebelum dihapus secara permanen.

Lihat informasi grup

Contohnya, jalankan perintah berikut untuk melihat informasi grup.

SHOW PROC '/colocation_group';

Perintah tersebut mengembalikan informasi berikut.

+-------------+--------------+----------+------------+----------------+----------+----------+
| GroupId     | GroupName    | TableIds | BucketsNum | ReplicationNum | DistCols | IsStable |
+-------------+--------------+----------+------------+----------------+----------+----------+
| 11912.11916 | 11912_group1 | 11914    | 8          | 3              | int(11)  | true     |
+-------------+--------------+----------+------------+----------------+----------+----------+

Tabel berikut menjelaskan kolom-kolom tersebut.

Kolom

Deskripsi

GroupId

Identifier unik grup di seluruh kluster. Bagian pertama adalah ID database, dan bagian kedua adalah ID grup.

GroupName

Nama lengkap grup.

TableIds

Daftar ID tabel yang termasuk dalam grup ini.

BucketsNum

Jumlah bucket.

ReplicationNum

Jumlah replika.

DistCols

Tipe data kolom distribusi.

IsStable

Menunjukkan apakah grup tersebut stabil.

Anda dapat menjalankan perintah berikut untuk melihat distribusi data grup tertentu.

SHOW PROC '/colocation_group/GroupId';
SHOW PROC '/colocation_group/11912.11916';

Perintah tersebut mengembalikan informasi berikut.

+-------------+---------------------+
| BucketIndex | BackendIds          |
+-------------+---------------------+
| 0           | 10002, 10004, 10003 |
| 1           | 10002, 10004, 10003 |
| 2           | 10002, 10004, 10003 |
| 3           | 10002, 10004, 10003 |
| 4           | 10002, 10004, 10003 |
| 5           | 10002, 10004, 10003 |
| 6           | 10002, 10004, 10003 |
| 7           | 10002, 10004, 10003 |
+-------------+---------------------+
8 rows in set (0.00 sec)

Ubah properti grup

Jalankan pernyataan berikut untuk memindahkan tabel ke Colocation Group yang berbeda:

ALTER TABLE tbl SET ("colocate_with" = "group_name");

Contoh

  1. Tetapkan tabel orders dan lineitem dalam dataset TPC-H ke Colocation Group yang sama.

    use tpc_h_sf100;
    ALTER TABLE orders SET ("colocate_with" = "cg_tpc_orders");
    ALTER TABLE lineitem SET ("colocate_with" = "cg_tpc_orders");
  2. Jalankan kueri berikut.

    select count(1) from orders as o join lineitem as l on o.o_orderkey = l.l_orderkey;
  3. Periksa apakah Colocate Join aktif di tab Query Plan untuk kueri di antarmuka StarRocks Manager.

    Saat colocate bernilai true, Colocate Join telah berlaku. Dalam rencana eksekusi, hal ini muncul sebagai colocate: true. Fragmen rencana kueri yang bersesuaian adalah:

2:HASH JOIN
|  join op: INNER JOIN (COLOCATE)
|  colocate: true
|  equal join conjunct: 10: l_orderkey = 1: o_orderkey
|
|----1:OlapScanNode
|       TABLE: orders
|       PREAGGREGATION: ON
|       PREDICATES: 1: o_orderkey IS NOT NULL
|       partitions=1/1
|       rollup: orders
|       tabletRatio=96/96
|       tabletList=12403,12405,12407,12409,12411,12413,12415,12417,12419,12421 ...
|       cardinality=135000000
|       avgRowSize=1.0
|       numNodes=0

Verifikasi pemangkasan bucket dan partisi

Di tab Query Plan untuk kueri Anda di antarmuka StarRocks Manager, Anda dapat melihat parameter partition atau tabletRatio untuk memverifikasi apakah pemangkasan partisi atau pemangkasan bucket aktif.

Bagaimana cara mengatasi kenaikan memori FE yang terus-menerus hingga memicu peringatan memori?

Saat memori FE terus meningkat dan memicu peringatan memori, atasi masalah tersebut dengan urutan berikut:

  1. Periksa pembengkakan metadata — Jalankan SHOW PROC '/statistic' dan periksa total TabletNum. Total TabletNum di atas 1.000.000 menunjukkan adanya pembengkakan metadata.

  2. Temukan kueri yang memakan banyak resource — Jika TabletNum normal, kueri tabel log audit _starrocks_audit_db_.starrocks_audit_tbl, urutkan catatan berdasarkan konsumsi CPU atau memori, lalu optimalkan pernyataan SQL berbeban tinggi tersebut.

  3. Atasi ketidakseimbangan beban — Konfigurasikan SLB dan kolam koneksi sisi klien untuk mengaktifkan penyeimbangan beban di seluruh node FE. Hal ini mencegah permintaan terkonsentrasi pada satu FE Leader, yang menyebabkan lonjakan memori dan GC yang sering.

  4. Optimalkan metode penulisan — Ganti penyisipan VALUES besar dengan Stream Load untuk menghilangkan hotspot parsing FE di sumbernya.