All Products
Search
Document Center

Hologres:Mulai menggunakan indeks Hologres

Last Updated:Jun 22, 2026

Topik ini memperkenalkan indeks utama dalam Hologres—seperti kunci distribusi, kolom waktu event (kunci segmen), dan kunci pengelompokan—untuk membantu Anda memulai penggunaan indeks dan meningkatkan performa kueri selama pengembangan dengan Hologres.

Cara kerja Hologres

Hologres adalah gudang data terdistribusi yang menggunakan komputasi paralel dan vektor untuk memberikan tanggapan kueri dalam hitungan detik. Karena arsitektur ini, distribusi data sangat penting bagi performa, mencakup cara data diseimbangkan di seluruh node terdistribusi—yang diatur oleh distribution key—serta cara data diurutkan dalam file pada satu node, yang diatur oleh event time column (juga dikenal sebagai segment key). Hologres secara default menggunakan format penyimpanan kolom (columnar) untuk skenario pemrosesan analitik daring (OLAP), sehingga urutan data dalam file—yang diatur oleh clustering key—juga sangat penting. Menguasai ketiga konsep ini merupakan kunci untuk mengoptimalkan performa. Karena properti tata letak data ini ditetapkan saat data ditulis dan mahal untuk diubah, kami menyarankan Anda merancang tabel dengan ketiga atribut tersebut sejak awal. Atribut yang tidak secara langsung memengaruhi tata letak data, seperti bitmap indexes dan dictionary encoding, dapat disesuaikan nanti sesuai kebutuhan.

Hologres menggunakan struktur metadata tiga tingkat: Database > Schema > Tabel. Untuk menghindari kueri lintas database, kami menyarankan mengelompokkan tabel-tabel yang terkait secara logis dalam satu schema yang sama. Database merupakan unit dasar untuk isolasi metadata, bukan isolasi sumber daya.

Dasar-dasar optimasi SQL

Merancang tabel dengan strategi distribusi data yang tepat memungkinkan kueri SQL menemukan data dengan cepat, mengurangi I/O, mengonsumsi lebih sedikit sumber daya komputasi, dan mencapai performa kueri yang lebih tinggi. Distribusi data yang seimbang juga memastikan sumber daya konkuren digunakan secara efisien serta menghindari bottleneck pada satu titik. Diagram berikut mengilustrasikan cara kueri SQL mengambil data dan bagaimana I/O dikurangi.image

  • Pemangkasan partisi (Partition pruning): Saat kueri SQL menargetkan tabel partisi, pengoptimal kueri menggunakan pemangkasan partisi untuk menemukan partisi yang relevan. Jika kondisi filter kueri tidak mencakup kunci partisi, kueri harus memindai semua partisi, yang menyebabkan I/O berlebihan. Sebagai aturan umum, partisi berdasarkan hari merupakan praktik yang baik. Pemangkasan partisi dilewati untuk tabel non-partisi.

  • Pemangkasan shard (Shard pruning): Gunakan distribution key untuk menemukan shard data yang berisi data yang dibutuhkan secara cepat. Hal ini mengurangi konsumsi sumber daya untuk satu kueri dan mendukung throughput yang lebih tinggi untuk kueri konkuren. Jika shard tertentu tidak dapat ditemukan, framework terdistribusi menjadwalkan semua shard untuk berpartisipasi dalam komputasi. Hal ini meningkatkan paralelisme untuk satu kueri tetapi menggunakan lebih banyak sumber daya dan menurunkan konkurensi keseluruhan. Beberapa operator yang memerlukan eksekusi terpusat juga dapat menimbulkan overhead pengacakan tambahan. Sebagai praktik terbaik, pilih kolom dengan distribusi data yang merata, seperti ID pesanan, ID pengguna, atau ID event, sebagai distribution key. Jika beberapa tabel yang perlu digabungkan memiliki distribution key yang sama, data terkait akan ditempatkan bersama (co-located) pada shard yang sama, memungkinkan operasi penggabungan lokal yang efisien.

  • Pemangkasan kunci segmen (Segment key pruning): Gunakan segment key (event time column) untuk menemukan file data spesifik dalam satu node, sehingga menghindari akses ke file yang tidak diperlukan. Jika data tidak dapat difilter pada tingkat ini, semua file harus dipindai.

  • Pemangkasan kunci pengelompokan (Clustering key pruning): Gunakan clustering key untuk menemukan segmen data dalam satu file secara cepat. Hal ini meningkatkan efisiensi kueri rentang (range queries) dan pengurutan kolom.

Optimasi SQL dalam praktik

Bagian ini menggunakan kueri TPC-H untuk menunjukkan cara mengatur indeks Hologres guna meningkatkan performa kueri. Untuk informasi lebih lanjut tentang TPC-H, lihat Ikhtisar rencana pengujian.

Referensi SQL TPC-H

Kueri TPC-H Q1

Kueri TPC-H Q1 melakukan agregasi dan pemfilteran pada kolom-kolom tertentu dari tabel lineitem. Kueri ini mencakup kondisi berikut:

l_shipdate <=: Ini adalah kondisi filter. Untuk mendukung pemfilteran rentang yang efisien dan mengambil data yang diperlukan secara cepat, Anda harus menentukan indeks yang sesuai.

--TPC-H Q1
SELECT
        l_returnflag,
        l_linestatus,
        SUM(l_quantity) AS sum_qty,
        SUM(l_extendedprice) AS sum_base_price,
        SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
        SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
        AVG(l_quantity) AS avg_qty,
        AVG(l_extendedprice) AS avg_price,
        AVG(l_discount) AS avg_disc,
        COUNT(*) AS count_order
FROM
        lineitem
WHERE
        l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY
        l_returnflag,
        l_linestatus
ORDER BY
        l_returnflag,
        l_linestatus;

Kueri TPC-H Q4

Kueri TPC-H Q4 terutama menggabungkan tabel lineitem dan orders. Kueri ini mencakup kondisi berikut:

  • o_orderdate >= DATE '1996-07-01': Ini adalah kondisi filter. Untuk mendukung pemfilteran rentang yang efisien dan mengambil data yang diperlukan secara cepat, Anda harus menentukan indeks yang sesuai.

  • l_orderkey = o_orderkey: Ini adalah kondisi penggabungan antara kedua tabel. Untuk performa terbaik, gunakan indeks yang sama pada kedua tabel agar memungkinkan penggabungan lokal (local join), yang mengurangi pengacakan data selama operasi.

    --TPC-H Q4 Query
    SELECT
            o_orderpriority,
            COUNT(*) AS order_count
    FROM
            orders
    WHERE
            o_orderdate >= DATE '1996-07-01'
            AND o_orderdate < DATE '1996-07-01' + INTERVAL '3' MONTH
            AND EXISTS (
                    SELECT
                            *
                    FROM
                            lineitem
                    WHERE
                            l_orderkey = o_orderkey
                            AND l_commitdate < l_receiptdate
            )
    GROUP BY
            o_orderpriority
    ORDER BY
            o_orderpriority;

Rekomendasi pembuatan tabel

Kueri Q1 dan Q4 melibatkan tabel lineitem dan orders.

hologres_dataset_tpch_100g.lineitem

Baik kueri Q1 maupun Q4 melibatkan tabel lineitem, tetapi menggunakan kolom dan kondisi yang berbeda.

  • Untuk kueri Q1: Kueri terutama menggunakan l_shipdate untuk pemfilteran rentang. Clustering key mempercepat pemindaian rentang dengan memanfaatkan urutan data yang diurutkan dalam file. Oleh karena itu, tetapkan l_shipdate sebagai clustering key. Segment key (event time column) mempertahankan urutan antar file. Untuk kolom tanggal yang nilainya meningkat atau menurun secara monoton, menetapkannya sebagai segment key memungkinkan pemangkasan kunci segmen yang efektif. Oleh karena itu, Anda juga dapat menetapkan l_shipdate sebagai segment key.

  • Untuk kueri Q4: Kueri menggabungkan tabel lineitem dengan tabel orders pada kolom l_orderkey dan o_orderkey. Distribution key menentukan strategi distribusi data. Sistem menempatkan data dengan nilai kunci yang sama pada shard yang sama. Jika dua tabel berada dalam kelompok tabel yang sama dan digabungkan berdasarkan kolom distribution key-nya, sistem secara otomatis mendistribusikan catatan yang cocok ke shard yang sama saat data ditulis. Ketika tabel-tabel ini digabungkan, sistem melakukan penggabungan lokal pada setiap node tanpa mengacak data melalui jaringan. Hal ini menghindari pengacakan dan redistribusi data saat runtime, sehingga secara signifikan meningkatkan efisiensi eksekusi. Oleh karena itu, tetapkan l_orderkey sebagai distribution key.

  • Struktur tabel akhir untuk lineitem adalah sebagai berikut:

    BEGIN;
    CREATE TABLE hologres_dataset_tpch_100g.lineitem
    (
        l_ORDERKEY      BIGINT      NOT NULL,
        L_PARTKEY       INT         NOT NULL,
        L_SUPPKEY       INT         NOT NULL,
        L_LINENUMBER    INT         NOT NULL,
        L_QUANTITY      DECIMAL(15,2) NOT NULL,
        L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,
        L_DISCOUNT      DECIMAL(15,2) NOT NULL,
        L_TAX           DECIMAL(15,2) NOT NULL,
        L_RETURNFLAG    TEXT        NOT NULL,
        L_LINESTATUS    TEXT        NOT NULL,
        L_SHIPDATE      TIMESTAMPTZ NOT NULL,
        L_COMMITDATE    TIMESTAMPTZ NOT NULL,
        L_RECEIPTDATE   TIMESTAMPTZ NOT NULL,
        L_SHIPINSTRUCT  TEXT        NOT NULL,
        L_SHIPMODE      TEXT        NOT NULL,
        L_COMMENT       TEXT        NOT NULL,
        PRIMARY KEY (L_ORDERKEY,L_LINENUMBER)
    )
    WITH (
        distribution_key = 'L_ORDERKEY',--Enables local join.
        clustering_key = 'L_SHIPDATE',--Accelerates range filtering.
        event_time_column = 'L_SHIPDATE'--Accelerates segment key pruning.
      );
    COMMIT;

hologres_dataset_tpch_100g.orders

Dalam contoh ini, tabel orders digunakan dalam kueri Q4.

  • Tetapkan kolom o_orderkey pada tabel orders sebagai distribution key untuk memanfaatkan kemampuan penggabungan lokal dan meningkatkan efisiensi kueri penggabungan.

  • Kolom o_orderdate terutama digunakan untuk pemfilteran berdasarkan tanggal. Tetapkan sebagai segment key untuk mempercepat pemangkasan kunci segmen.

  • Struktur tabel akhir untuk orders adalah sebagai berikut:

    BEGIN;
    CREATE TABLE hologres_dataset_tpch_100g.orders
    (
        O_ORDERKEY      BIGINT      NOT NULL PRIMARY KEY,
        O_CUSTKEY       INT         NOT NULL,
        O_ORDERSTATUS   TEXT        NOT NULL,
        O_TOTALPRICE    DECIMAL(15,2) NOT NULL,
        O_ORDERDATE     timestamptz NOT NULL,
        O_ORDERPRIORITY TEXT        NOT NULL,
        O_CLERK         TEXT        NOT NULL,
        O_SHIPPRIORITY  INT         NOT NULL,
        O_COMMENT       TEXT        NOT NULL
    )
    WITH (
        distribution_key = 'O_ORDERKEY',--Enables local join.
        event_time_column = 'O_ORDERDATE'--Accelerates segment key pruning.
      );
    COMMIT;

Impor data sampel

Anda dapat dengan cepat mengimpor data TPC-H sebesar 100 GB ke instans Hologres Anda menggunakan fitur Import public datasets with a few clicks di HoloWeb. Di HoloWeb, pilih Data Solutions dari bilah navigasi atas, lalu klik Import public datasets with a few clicks di panel navigasi kiri. Pada halaman konfigurasi, pilih Instance Name (misalnya, holo_test) dan Database. Kemudian, pilih tpch_100g dari daftar Public Dataset Name. Sistem secara otomatis menghasilkan skrip SQL yang tidak dapat diedit di bagian bawah halaman. Skrip ini mencakup pernyataan untuk membuat skema hologres_foreign_dataset_tpch_100g dan hologres_dataset_tpch_100g, serta mengimpor data secara berurutan ke tabel eksternal seperti customer, lineitem, nation, orders, part, partsupp, region, dan supplier.

Hasil pengujian performa

Bagian ini membandingkan performa kueri sebelum dan sesudah menetapkan properti tabel yang direkomendasikan (indeks).

  • Lingkungan pengujian

    • Spesifikasi instans: 32-core

    • Jenis jaringan: VPC

    • Jalankan setiap kueri dua kali menggunakan klien PSQL dan catat latensi eksekusi kedua.

  • Kesimpulan

    • Untuk kueri yang difilter pada satu tabel, menetapkan kolom filter sebagai clustering key secara efektif mempercepat kueri.

    • Untuk kueri penggabungan multi-tabel, menetapkan kolom penggabungan sebagai distribution key secara signifikan meningkatkan efisiensi penggabungan.

    Kueri

    Latensi dengan indeks

    Latensi tanpa indeks

    Q1

    48,293 ms

    59,483 ms

    Q4

    822,389 ms

    3027,957 ms

Referensi

Informasi lebih lanjut

Prinsip teknis

Pelajari lebih dalam prinsip teknis inti Hologres (arsitektur, mesin penyimpanan, dan mesin komputasi): Teknologi Inti Gudang Data Real-time Cloud-native Alibaba Cloud.

Aktivasi layanan

Impor data

Kueri data

O&M dan pemantauan

Kasus penggunaan dan praktik terbaik

Praktik dan kasus penggunaan: Praktik terbaik dan kasus penggunaan pelanggan klasik untuk skenario industri khas.