All Products
Search
Document Center

PolarDB:hypopg (indeks hipotetis)

Last Updated:Nov 11, 2025

Ekstensi hypopg membantu Anda mengevaluasi apakah suatu indeks dapat meningkatkan kinerja satu atau beberapa kueri.

Cakupan

  • Sebelum menggunakan ekstensi hypopg, Anda harus menentukan hal-hal berikut:

    • Kueri yang akan dioptimalkan.

    • Jenis indeks yang akan dicoba.

  • PolarDB for PostgreSQL mendukung versi berikut:

    • PostgreSQL 16 (versi mesin minor 2.0.16.9.8.0 dan yang lebih baru)

    • PostgreSQL 14 (versi mesin minor 2.0.14.5.1.0 dan yang lebih baru)

    • PostgreSQL 11 (versi mesin minor 2.0.11.9.28.0 dan yang lebih baru)

    Catatan

    Anda dapat melihat versi mesin minor di konsol atau menjalankan pernyataan SHOW polardb_version;. Jika kluster Anda tidak memenuhi persyaratan versi mesin minor, Anda dapat meningkatkan versi mesin minor.

Ikhtisar

Ekstensi hypopg adalah ekstensi sumber terbuka yang didukung oleh PolarDB for PostgreSQL dan . Indeks hipotetis yang dibuat oleh hypopg tidak disimpan di tabel sistem mana pun. Sebaliknya, indeks tersebut disimpan dalam memori privat koneksi Anda. Karena indeks hipotetis tidak benar-benar ada secara fisik dalam file apa pun, indeks tersebut hanya digunakan oleh pernyataan EXPLAIN sederhana yang tidak menyertakan opsi ANALYZE. Indeks hipotetis bukanlah indeks nyata dan tidak mengonsumsi CPU, disk, atau sumber daya lainnya.

Catatan

Ekstensi hypopg mendukung jenis indeks berikut:

  • btree: Indeks B-tree.

  • brin: Block Range Indexes (BRIN).

  • hash: Indeks hash.

  • bloom: Indeks Bloom (mengharuskan Anda menginstal ekstensi bloom terlebih dahulu).

Cara Penggunaan

  1. Instal ekstensi.

    1. Instal ekstensi hypopg.

      CREATE EXTENSION hypopg;
    2. Periksa apakah ekstensi telah terinstal.

      \dx hypopg

      Hasil berikut dikembalikan:

                        Daftar ekstensi yang terinstal
        Nama   | Versi | Skema  |             Deskripsi
      --------+-------+--------+-------------------------------------
       hypopg | 1.3.1 | public | Indeks hipotetis untuk PostgreSQL
      (1 baris)
      Catatan
      • Hasil menunjukkan bahwa versi 1.3.1 ekstensi hypopg telah terinstal.

      • Anda juga dapat melakukan kueri pada tabel pg_extension untuk memverifikasi bahwa ekstensi hypopg telah terinstal. Contohnya:

        SELECT * FROM pg_extension WHERE extname = 'hypopg';

        Hasil berikut dikembalikan:

        extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
        --------+----------+--------------+----------------+------------+-----------+--------------
         hypopg |       10 |        2200 | t               | 1.3.1      |           |
        (1 baris)
  2. Konfigurasikan parameter.

    Parameter

    Deskripsi

    hypopg.enabled

    Nilai default adalah on. Nilai yang valid:

    • on: Mengaktifkan ekstensi hypopg.

    • off: Menonaktifkan ekstensi hypopg.

      Catatan

      Saat ekstensi hypopg dinonaktifkan, indeks hipotetis tidak digunakan. Namun, indeks hipotetis yang sudah ada tidak dihapus.

    hypopg.use_real_oids

    Nilai default adalah off. Nilai yang valid:

    • off: hypopg tidak menggunakan pengidentifikasi objek (OID) nyata. Sebagai gantinya, hypopg memilih pengidentifikasi dari rentang bebas. Pengidentifikasi ini dicadangkan oleh database untuk penggunaan di masa depan. Rentang pengidentifikasi bebas dihitung secara dinamis saat hypopg pertama kali digunakan. Metode ini memiliki keuntungan dapat digunakan pada server standby dan tidak menimbulkan masalah.

      Catatan

      Kerugian dari pengaturan ini adalah Anda tidak dapat memiliki lebih dari sekitar 2.500 indeks hipotetis secara bersamaan. Jika jumlah indeks hipotetis yang ada melebihi batas maksimum, pembuatan indeks baru akan memakan waktu lama. Untuk mengatasi masalah ini, panggil fungsi hypopg_reset(). Untuk informasi selengkapnya tentang cara menggunakan fungsi ini, lihat Operasi indeks hipotetis.

    • on: hypopg menggunakan OID nyata. Menyetel hypopg.use_real_oids ke on mencegah waktu pembuatan yang lama ketika jumlah maksimum indeks terlampaui. hypopg meminta pengidentifikasi nyata. Hal ini memerlukan lebih banyak sumber daya kunci, tidak dapat digunakan pada server standby, tetapi memungkinkan semua pengidentifikasi digunakan. Untuk informasi selengkapnya tentang cara menggunakan fitur ini, lihat Operasi indeks hipotetis.

      Catatan

      Mengganti parameter ini tidak mengharuskan Anda mengatur ulang pengidentifikasi indeks hipotetis. Pengidentifikasi nyata dan tidak nyata dapat berdampingan.

  3. Uninstal ekstensi.

    DROP EXTENSION hypopg;
Catatan

Untuk informasi selengkapnya, lihat Operasi indeks hipotetis.

Contoh

  1. Buat tabel dan masukkan data. Tabel tidak memiliki indeks. Contohnya:

    CREATE TABLE hypo (id integer, val text);
    INSERT INTO hypo SELECT i, 'line ' || i FROM generate_series(1, 100000) i;
    VACUUM ANALYZE hypo;

    Anda dapat memeriksa apakah suatu indeks dapat meningkatkan kueri sederhana. Contohnya:

    EXPLAIN SELECT val FROM hypo WHERE id = 1;

    Hasil berikut dikembalikan:

                           RENCANA KUERI
    --------------------------------------------------------
     Seq Scan pada hypo  (cost=0.00..1791.00 rows=1 width=10)
       Filter: (id = 1)
    (2 baris)
    Catatan

    Kueri melakukan pemindaian sekuensial karena tabel hypo tidak memiliki indeks.

  2. Buat indeks hipotetis. Contohnya:

    SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo (id)');

    Hasil berikut dikembalikan:

    indexrelid |      indexname
    ------------+----------------------
          13925 | <13925>btree_hypo_id
    (1 baris)

    Tabel berikut menjelaskan parameter-parameter tersebut.

    Parameter

    Deskripsi

    13925

    Pengidentifikasi indeks hipotetis.

    <13925>btree_hypo_id

    Nama indeks hipotetis yang dihasilkan.

    Catatan
    • Indeks B-tree sederhana pada kolom id bermanfaat untuk kueri ini.

    • Fungsi hypopg_create_index() menerima pernyataan CREATE INDEX standar apa pun dan membuat indeks hipotetis untuk setiap pernyataan tersebut. Pernyataan lain yang diberikan ke fungsi ini akan diabaikan.

    • Pengidentifikasi dihasilkan secara dinamis. Dalam contoh ini, nilainya adalah 13925.

  3. Jalankan pernyataan EXPLAIN untuk menentukan apakah database menggunakan indeks tersebut. Contohnya:

    EXPLAIN SELECT val FROM hypo WHERE id = 1;

    Hasil berikut dikembalikan:

                                         RENCANA KUERI
    ------------------------------------------------------------------------------------
     Index Scan menggunakan "<13925>btree_hypo_id" pada hypo  (cost=0.04..8.06 rows=1 width=10)
       Index Cond: (id = 1)
    (2 baris)
    Catatan

    Rencana eksekusi menunjukkan bahwa database menggunakan indeks ini.

  4. Jalankan pernyataan EXPLAIN ANALYZE untuk menentukan apakah database menggunakan indeks hipotetis selama eksekusi aktual. Contohnya:

    EXPLAIN ANALYZE SELECT val FROM hypo WHERE id = 1;

    Hasil berikut dikembalikan:

                                                RENCANA KUERI
    ---------------------------------------------------------------------------------------------------
     Seq Scan pada hypo  (cost=0.00..1791.00 rows=1 width=10) (actual time=0.030..15.439 rows=1 loops=1)
       Filter: (id = 1)
       Rows Removed by Filter: 99999
     Planning Time: 0.066 ms
     Execution Time: 15.492 ms
    (5 baris)
    Catatan

    Selama eksekusi aktual, database tidak menggunakan indeks hipotetis.

Operasi indeks hipotetis

Ekstensi hypopg juga menyediakan beberapa fungsi dan tampilan yang berguna.

  • Tampilan hypopg_list_indexes: Menampilkan semua indeks hipotetis yang telah dibuat. Contohnya:

    SELECT * FROM hypopg_list_indexes;

    Hasil berikut dikembalikan:

     indexrelid |      index_name      | schema_name | table_name | am_name
    ------------+----------------------+-------------+------------+---------
          13925 | <13925>btree_hypo_id | public      | hypo       | btree
    (1 baris)
  • Fungsi hypopg(): Menampilkan semua indeks hipotetis yang telah dibuat dalam format yang sama seperti pg_index. Contohnya:

    SELECT * FROM hypopg();

    Hasil berikut dikembalikan:

          indexname       | indexrelid | indrelid | innatts | indisunique | indkey | indcollation | indclass | indoption | indexprs | indpred | amid
    ----------------------+------------+----------+---------+-------------+--------+--------------+----------+-----------+----------+---------+------
     <13925>btree_hypo_id |      13925 |    16450 |       1 | f           | 1      | 0            | 1978     |           |          |         |  403
    (1 baris)
  • Fungsi hypopg_get_indexdef(oid): Mengambil perintah CREATE INDEX aktual dari pengidentifikasi indeks hipotetis. Contohnya:

    SELECT index_name, hypopg_get_indexdef(indexrelid) FROM hypopg_list_indexes;

    Hasil berikut dikembalikan:

          index_name      |             hypopg_get_indexdef
    ----------------------+----------------------------------------------
     <13925>btree_hypo_id | CREATE INDEX ON public.hypo USING btree (id)
    (1 baris)
  • Fungsi hypopg_relation_size(oid): Memperkirakan ukuran indeks hipotetis. Contohnya:

    SELECT index_name, pg_size_pretty(hypopg_relation_size(indexrelid))
    FROM hypopg_list_indexes;

    Hasil berikut dikembalikan:

          index_name      | pg_size_pretty
    ----------------------+----------------
     <13925>btree_hypo_id | 2544 kB
    (1 baris)
  • Fungsi hypopg_drop_index(oid): Menghapus indeks hipotetis dengan pengidentifikasi tertentu. Contohnya:

    SELECT hypopg_drop_index(13925);

    Hasil berikut dikembalikan:

     hypopg_drop_index
    -------------------
     t
    (1 baris)
  • Fungsi hypopg_reset(): Menghapus semua indeks hipotetis. Contohnya:

    SELECT hypopg_reset();

    Hasil berikut dikembalikan:

     hypopg_reset
    --------------
    
    (1 baris)