全部产品
Search
文档中心

PolarDB:Gunakan pernyataan EXPLAIN untuk menentukan apakah akan menggunakan IMCI untuk mempercepat query SQL

更新时间:Jul 06, 2025

Topik ini menjelaskan cara menggunakan pernyataan EXPLAIN untuk menentukan apakah indeks kolom dalam memori (IMCI) digunakan untuk mempercepat query SQL.

Contoh

Dalam kluster PolarDB for MySQL, rencana eksekusi untuk query pada data format kolom ditampilkan dalam format pohon horizontal, berbeda dari output rencana eksekusi untuk query pada data format baris. Anda dapat mengeksekusi pernyataan EXPLAIN untuk melihat rencana eksekusi query SQL dan menentukan apakah IMCI digunakan untuk mempercepat query tersebut.

Contoh Query SQL:

EXPLAIN SELECT l_orderkey, SUM(l_extendedprice * (1 - l_discount)) AS revenue, o_orderdate, o_shippriority
FROM customer, orders, lineitem
WHERE c_mktsegment = 'BUILDING'
AND c_custkey = o_custkey
AND l_orderkey = o_orderkey
AND o_orderdate < date '1995-03-24'
AND l_shipdate > date '1995-03-24'
GROUP BY l_orderkey, o_orderdate, o_shippriority
ORDER BY revenue DESC, o_orderdate;

Rencana Eksekusi Ketika Data yang Diquery dalam Format Baris:

+----+-------------+----------+------------+------+--------------------+------------+---------+-----------------------------+--------+----------+----------------------------------------------+
| id | select_type | table    | partitions | type | possible_keys      | key        | key_len | ref                         | rows   | filtered | Extra                                        |
+----+-------------+----------+------------+------+--------------------+------------+---------+-----------------------------+--------+----------+----------------------------------------------+
|  1 | SIMPLE      | customer | NULL       | ALL  | PRIMARY            | NULL       | NULL    | NULL                        | 147.630 |    10.00 | Menggunakan where; Menggunakan temporary; Menggunakan filesort |
|  1 | SIMPLE      | orders   | NULL       | ref  | PRIMARY,ORDERS_FK1 | ORDERS_FK1 | 4       | tpch100g.customer.C_CUSTKEY |     14 |    33.33 | Menggunakan where                                  |
|  1 | SIMPLE      | lineitem | NULL       | ref  | PRIMARY            | PRIMARY    | 4       | tpch100g.orders.O_ORDERKEY  |      4 |    33.33 | Menggunakan where                                  |
+----+-------------+----------+------------+------+--------------------+------------+---------+-----------------------------+--------+----------+----------------------------------------------+
3 baris dalam set, 1 peringatan (0,00 detik)

Rencana Eksekusi (Format Pohon Horizontal) Ketika Data yang Diquery dalam Format Kolom:

+----+----------------------------+----------+--------+--------+-----------------------------------------------------------------------------+
| ID | Operator                   | Name     | E-Rows | E-Cost | Extra Info                                                                  |
+----+----------------------------+----------+--------+--------+-----------------------------------------------------------------------------+
|  1 | Select Statement           |          |        |        | Rencana Eksekusi IMCI (max_dop = 4, max_query_mem = 858993459)                |
|  2 | └─Sort                     |          |        |        | Kunci Sortir: revenue DESC,o_orderdate ASC                                      |
|  3 |   └─Hash Groupby           |          |        |        | Kunci Grup: (lineitem.L_ORDERKEY, orders.O_ORDERDATE, orders.O_SHIPPRIORITY) |
|  4 |     └─Hash Join            |          |        |        | Kondisi Gabung: orders.O_ORDERKEY = lineitem.L_ORDERKEY                          |
|  5 |       ├─Hash Join          |          |        |        | Kondisi Gabung: customer.C_CUSTKEY = orders.O_CUSTKEY                            |
|  6 |       │ ├─Table Scan       | customer |        |        | Kondisi: (C_MKTSEGMENT = "BUILDING")                                           |
|  7 |       │ └─Table Scan       | orders   |        |        | Kondisi: (O_ORDERDATE < 03/24/1995)                                            |
|  8 |       └─Table Scan         | lineitem |        |        | Kondisi: (L_SHIPDATE > 03/24/1995)                                             |
+----+----------------------------+----------+--------+--------+-----------------------------------------------------------------------------+
8 baris dalam set (0,01 detik)

Referensi

IMCI hanya dapat mengakses kolom-kolom yang dicakup oleh IMCI tersebut. Jika tabel atau kolom yang dirujuk dalam pernyataan SQL tidak sepenuhnya dicakup oleh IMCI, maka IMCI tidak akan berlaku.

  • Untuk memeriksa apakah IMCI dibuat untuk tabel yang dirujuk dalam pernyataan SQL, panggil prosedur tersimpan dbms_imci.check_columnar_index(). Prosedur ini mengurai pernyataan SQL yang dimasukkan, mendapatkan semua kolom yang dirujuk, dan memeriksa apakah kolom-kolom tersebut dicakup oleh IMCI. Untuk informasi lebih lanjut, lihat Periksa Apakah IMCI Dibuat untuk Tabel dalam Pernyataan SQL.

  • Untuk mendapatkan pernyataan DDL yang digunakan untuk membuat IMCI, panggil prosedur tersimpan dbms_imci.columnar_advise(). Prosedur ini mengembalikan pernyataan DDL berdasarkan pernyataan SQL yang dimasukkan. Setelah mengeksekusi pernyataan DDL, IMCI dibuat untuk mencakup semua kolom yang dirujuk dalam pernyataan SQL. Untuk informasi lebih lanjut, lihat Dapatkan Pernyataan DDL yang Digunakan untuk Membuat IMCI.

FAQ

Mengapa query SQL tidak menggunakan IMCI untuk percepatan?

Query SQL menggunakan IMCI untuk percepatan hanya jika kondisi berikut terpenuhi: Node IMCI baca saja ditambahkan ke kluster, IMCI dibuat pada tabel yang terlibat dalam query SQL, biaya eksekusi perkiraan dari query SQL melebihi ambang batas tertentu, dan query SQL diteruskan ke node IMCI baca saja. Jika query SQL tidak menggunakan IMCI, Anda dapat melakukan langkah-langkah berikut untuk menganalisis masalah:

  1. Periksa apakah query SQL diteruskan ke node IMCI baca saja.

    • Periksa apakah node IMCI baca saja termasuk dalam selected nodes dari titik akhir kluster.

    • Periksa apakah query SQL diteruskan ke node IMCI baca saja dengan menggunakan fitur Penjelajah SQL. Untuk informasi lebih lanjut, lihat Penjelajah SQL.

    PolarProxy meneruskan query SQL ke node IMCI baca saja hanya jika kondisi berikut terpenuhi: Query SQL mengakses kluster menggunakan cluster endpoint, Transactional/Analytical Processing Splitting diaktifkan untuk titik akhir kluster, dan biaya eksekusi perkiraan dari query SQL melebihi ambang batas yang ditentukan oleh parameter loose_imci_ap_threshold atau loose_cost_threshold_for_imci. Anda dapat menambahkan petunjuk /*FORCE_IMCI_NODES*/ sebelum kata kunci SELECT dari pernyataan SQL untuk secara paksa meneruskan pernyataan SQL ke node IMCI baca saja. Untuk informasi lebih lanjut, lihat Tentukan Ambang Batas untuk Distribusi Permintaan Otomatis. Contoh:

    Parameter loose_imci_ap_threshold digunakan sebagai pengganti parameter loose_cost_threshold_for_imci dalam mesin database yang versi minor-nya adalah 8.0.1.1.39 atau lebih baru, atau 8.0.2.2.23 atau lebih baru.
    /*FORCE_IMCI_NODES*/EXPLAIN SELECT COUNT(*) FROM t1 WHERE t1.a > 1;
    Anda dapat membuat titik akhir kustom dan mengaitkan titik akhir tersebut dengan node IMCI baca saja. Ini memastikan bahwa query SQL diteruskan ke node IMCI baca saja untuk dieksekusi. Untuk informasi lebih lanjut, lihat Distribusi Permintaan Berbasis HTAP di Antara Node Penyimpanan Baris dan Node IMCI.
  2. Periksa apakah biaya eksekusi perkiraan dari query SQL lebih tinggi dari ambang batas tertentu.

    Pada node IMCI, optimiser memperkirakan biaya eksekusi query SQL. Jika biaya eksekusi perkiraan dari query SQL lebih tinggi dari ambang batas yang ditentukan oleh parameter loose_imci_ap_threshold atau cost_threshold_for_imci, optimiser menggunakan IMCI dalam query. Sebaliknya, optimiser menggunakan indeks baris asli dalam query.

    Jika pernyataan EXPLAIN menunjukkan bahwa rencana eksekusi masih tidak menggunakan IMCI setelah query SQL diteruskan ke node IMCI baca saja, bandingkan biaya eksekusi perkiraan dengan ambang batas yang ditentukan untuk menentukan apakah IMCI tidak digunakan karena biaya eksekusi perkiraan terlalu kecil. Anda dapat memeriksa nilai Last_query_cost untuk mendapatkan biaya eksekusi perkiraan dari pernyataan SQL sebelumnya. Contoh:

    -- Jalankan pernyataan EXPLAIN untuk melihat rencana eksekusi query SQL.
    EXPLAIN SELECT * FROM t1;
    -- Dapatkan biaya eksekusi perkiraan dari query SQL sebelumnya.
    SHOW STATUS LIKE 'Last_query_cost';
    Jika Anda menggunakan titik akhir kluster untuk terhubung ke kluster, kami sarankan Anda menambahkan petunjuk /*ROUTE_TO_LAST_USED*/ sebelum pernyataan SHOW STATUS LIKE 'Last_query_cost' untuk memastikan bahwa biaya eksekusi perkiraan dari pernyataan sebelumnya dapat ditemukan di node yang benar. Contoh: /*ROUTE_TO_LAST_USED*/SHOW STATUS LIKE 'Last_query_cost';

    Jika biaya eksekusi perkiraan dari query SQL kurang dari ambang batas yang ditentukan, Anda dapat menyesuaikan nilai loose_imci_ap_threshold atau loose_cost_threshold_for_imci. Anda juga dapat menggunakan HINT untuk menyesuaikan ambang batas biaya eksekusi untuk satu query SQL. Contoh:

    /*FORCE_IMCI_NODES*/EXPLAIN SELECT /*+ SET_VAR(cost_threshold_for_imci=0) */ COUNT(*) FROM t1 WHERE t1.a > 1;
  3. Periksa apakah tabel atau kolom yang terlibat dalam query SQL sepenuhnya termasuk dalam IMCI.

    Anda dapat memanggil prosedur tersimpan bawaan dbms_imci.check_columnar_index('<query_string>') untuk memeriksa apakah IMCI dibuat untuk tabel atau kolom dalam pernyataan SQL. Untuk informasi lebih lanjut, lihat Periksa Apakah IMCI Dibuat untuk Tabel dalam Pernyataan SQL. Contoh:

    CALL dbms_imci.check_columnar_index('SELECT COUNT(*) FROM t1 WHERE t1.a > 1');

    Jika tabel atau kolom yang terlibat dalam query SQL tidak sepenuhnya termasuk dalam IMCI, prosedur tersimpan mengembalikan tabel dan kolom yang tidak termasuk dalam IMCI. Dalam hal ini, Anda harus membuat IMCI untuk tabel dan kolom yang dikembalikan. Jika tabel atau kolom yang terlibat dalam query SQL sepenuhnya termasuk dalam IMCI, prosedur tersimpan mengembalikan set hasil kosong.

  4. Periksa apakah query SQL mendukung IMCI.

    Lihat batasan penggunaan IMCI untuk menentukan apakah query SQL mendukung IMCI. Untuk informasi lebih lanjut, lihat Batasan Penggunaan IMCI.

Jika query SQL masih tidak menggunakan IMCI, Anda dapat berkonsultasi dengan ahli atau hubungi kami.

Bagaimana cara membuat IMCI yang sesuai untuk query SQL?

Kami merekomendasikan Anda membuat IMCI berdasarkan kolom yang terlibat dalam query SQL. Untuk informasi lebih lanjut, lihat Periksa Apakah IMCI Dibuat untuk Tabel dalam Pernyataan SQL.

Query SQL menggunakan IMCI hanya jika IMCI mencakup semua kolom yang terlibat dalam query SQL. Jika kolom yang terlibat dalam query SQL tidak sepenuhnya dicakup oleh IMCI, Anda dapat menggunakan pernyataan ALTER TABLE untuk menambahkan IMCI. PolarDB menyediakan prosedur tersimpan bawaan untuk membantu operasi ini.

Catatan
  • Anda dapat menggunakan prosedur tersimpan dbms_imci.columnar_advise() untuk mendapatkan pernyataan DDL yang digunakan untuk membuat IMCI untuk query SQL. Jika Anda menggunakan pernyataan DDL untuk membuat IMCI, Anda dapat memastikan bahwa kolom yang terlibat dalam query SQL sepenuhnya termasuk dalam IMCI. Untuk informasi lebih lanjut, lihat Dapatkan Pernyataan DDL yang Digunakan untuk Membuat IMCI.

    dbms_imci.columnar_advise('<query_string>');
  • Anda dapat menggunakan prosedur tersimpan berikut untuk mendapatkan pernyataan DDL yang digunakan untuk membuat IMCI untuk batch query SQL: dbms_imci.columnar_advise_begin(), dbms_imci.columnar_advise_end(), dan dbms_imci.columnar_advise(). Untuk informasi lebih lanjut, lihat Dapatkan Pernyataan DDL yang Digunakan untuk Membuat IMCI Secara Batch.