全部产品
Search
文档中心

Hologres:Memulai dengan indeks Hologres

更新时间:Jul 02, 2025

Topik ini menjelaskan indeks yang didukung di Hologres, seperti kunci distribusi, kolom waktu kejadian (kunci segmen), dan kunci pengelompokan. Ini membantu Anda memahami cara menggunakan indeks dalam pengembangan Hologres untuk meningkatkan kinerja kueri.

Cara kerja Hologres

Hologres adalah gudang data terdistribusi yang menggunakan teknik komputasi paralel dan vektor untuk menanggapi kueri dalam hitungan detik. Distribution key dan event time column menentukan distribusi data dan memiliki dampak signifikan pada kinerja kueri. Data didistribusikan ke node berdasarkan kunci distribusi, dan file diurutkan dalam sebuah node berdasarkan kolom waktu kejadian. Dalam skenario pemrosesan analitik online (OLAP), penyimpanan berorientasi kolom digunakan secara default di Hologres. Konfigurasi clustering key juga penting karena menentukan bagaimana data diurutkan dalam sebuah file. Konfigurasi indeks yang tepat dapat meningkatkan kinerja kueri secara signifikan. Kami merekomendasikan agar Anda mengonfigurasi kunci distribusi, kolom waktu kejadian, dan kunci pengelompokan saat membuat tabel. Jika Anda mengonfigurasi indeks ini untuk tabel yang sudah ada, biaya penyesuaian akan tinggi. Untuk tabel yang sudah ada, Anda dapat mengonfigurasi indeks lain yang tidak memengaruhi distribusi data secara langsung, seperti Indeks bitmap dan properti pengkodean kamus, sesuai kebutuhan bisnis Anda.

Metadata di Hologres menggunakan model tiga lapis yang terdiri dari lapisan basis data, lapisan skema, dan lapisan tabel. Kami merekomendasikan menyimpan tabel yang secara logis terkait dalam skema yang sama untuk mencegah kueri lintas database. Metadata diisolasi oleh basis data, tetapi sumber daya tidak diisolasi oleh basis data.

Prinsip dasar optimasi SQL: Kurangi konsumsi sumber daya I/O dan optimalkan konkurensi

Jika Anda mengonfigurasi indeks yang sesuai untuk distribusi data saat membuat tabel, data yang ingin Anda kueri dapat ditemukan dengan cepat setelah pernyataan SQL dieksekusi. Hal ini mengurangi konsumsi sumber daya I/O dan komputasi serta mempercepat kueri. Distribusi data yang seimbang juga membantu meningkatkan pemanfaatan sumber daya konkuren dan mencegah kemacetan pada satu node. Gambar berikut menunjukkan proses eksekusi dari mengeksekusi pernyataan SQL hingga mendapatkan data. Ini membantu Anda memahami bagaimana konsumsi sumber daya I/O dikurangi.image

  • Pemangkasan partisi: Jika Anda melakukan kueri SQL pada tabel yang dipartisi, sistem menemukan partisi tempat data yang diperlukan berada dengan menggunakan fitur pemangkasan partisi. Jika tidak ada partisi yang cocok berdasarkan kondisi kueri, sistem perlu melintasi semua partisi, yang mengonsumsi sumber daya I/O berlebihan. Dalam banyak kasus, partisi per hari lebih sesuai. Untuk tabel non-partisi, pemangkasan partisi tidak terlibat.

  • Pemangkasan shard: Anda dapat menggunakan kunci distribusi untuk dengan cepat menemukan shard tempat data yang diinginkan berada. Ini mengurangi sumber daya yang dibutuhkan oleh satu pernyataan SQL dan mendukung throughput tinggi jika beberapa pernyataan SQL dieksekusi pada saat yang sama. Jika shard spesifik tidak dapat ditemukan, sistem menjadwalkan semua shard untuk komputasi berdasarkan kerangka kerja terdistribusi. Dalam hal ini, satu pernyataan SQL dieksekusi pada beberapa shard, yang mengonsumsi sejumlah besar sumber daya dan menurunkan konkurensi keseluruhan sistem. Biaya shuffle tambahan terjadi jika operator tertentu dieksekusi secara terpusat. Dalam banyak kasus, Anda dapat mengonfigurasi bidang yang nilainya didistribusikan secara merata sebagai bidang kunci distribusi, seperti ID pesanan, ID pengguna, dan ID acara. Kami merekomendasikan agar Anda mengonfigurasi kunci distribusi yang sama untuk tabel yang ingin Anda gabungkan untuk memungkinkan data terkait didistribusikan ke shard yang sama. Ini membantu mencapai efisiensi tinggi dalam operasi join lokal.

  • Pemangkasan kunci segmen: Anda dapat menggunakan kolom waktu kejadian untuk dengan cepat menemukan file tempat data yang diperlukan berada dari beberapa file pada node. Ini menghilangkan kebutuhan untuk mengakses file lainnya. Jika penyaringan gagal, sistem perlu melintasi semua file.

  • Pemangkasan kunci pengelompokan: Anda dapat menggunakan kunci pengelompokan untuk dengan cepat menemukan rentang data yang diinginkan dalam sebuah file. Ini membantu meningkatkan efisiensi kueri rentang dan pengurutan bidang.

Praktik untuk optimasi SQL

Bagian ini menjelaskan cara mengonfigurasi indeks di Hologres untuk mencapai kinerja yang lebih baik dalam kueri TPC-H. Untuk informasi lebih lanjut tentang kueri TPC-H, lihat Rencana Pengujian.

Contoh kueri SQL TPC-H

TPC-H Q1

TPC-H Q1 digunakan untuk mengumpulkan dan menyaring data di kolom tertentu dari tabel lineitem.

l_shipdate <=: Menyaring data. Anda harus mengonfigurasi indeks untuk memungkinkan penyaringan data berdasarkan rentang waktu.

--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;

TPC-H Q4

TPC-H Q4 terutama dilakukan untuk menggabungkan tabel lineitem dan orders.

  • o_orderdate >= DATE '1996-07-01': Menyaring data. Anda harus mengonfigurasi indeks untuk memungkinkan penyaringan data berdasarkan rentang waktu.

  • l_orderkey = o_orderkey: Menggabungkan dua tabel. Jika memungkinkan, konfigurasikan indeks yang sama untuk kedua tabel untuk memungkinkan join lokal. Ini membantu mengurangi pengacakan data antara dua tabel.

    --TPC-H Q4
    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;

Saran untuk pembuatan tabel

Berikut ini adalah saran untuk membuat tabel lineitem dan orders yang digunakan dalam TPC-H Q1 dan Q4.

hologres_dataset_tpch_100g.lineitem

Konfigurasi indeks dan kondisi kueri untuk tabel lineitem bervariasi dalam TPC-H Q1 dan TPC-H Q4.

  • TPC-H Q1: Kolom l_shipdate menentukan urutan waktu data dalam file dan digunakan untuk penyaringan rentang. Anda dapat mengonfigurasi kolom l_shipdate sebagai kolom kunci pengelompokan untuk mempercepat penyaringan rentang. Kolom waktu kejadian digunakan untuk mengurutkan file. Kami merekomendasikan agar Anda mengonfigurasi kolom tanggal di mana tanggal bertambah atau berkurang secara monotonik sebagai kolom waktu kejadian untuk memfasilitasi penyaringan file. Dalam TPC-H Q1, Anda dapat mengonfigurasi kolom l_shipdate sebagai kolom waktu kejadian.

  • TPC-H Q4: Kueri join dilakukan berdasarkan kolom l_orderkey dari tabel lineitem dan kolom o_orderkey dari tabel orders. Data didistribusikan berdasarkan kunci distribusi. Sistem mendistribusikan catatan data dengan nilai kunci distribusi yang sama ke shard yang sama. Jika dua tabel disimpan dalam grup tabel yang sama dan digabungkan berdasarkan kunci distribusi, sistem secara otomatis mendistribusikan catatan data yang memiliki nilai kunci distribusi yang sama ke shard yang sama. Selama penulisan data, join lokal dilakukan pada node saat ini, dan pengacakan data berdasarkan kunci join tidak diperlukan. Ini mencegah penyebaran dan redistribusi data selama runtime dan secara signifikan meningkatkan efisiensi eksekusi. Oleh karena itu, kami merekomendasikan agar Anda mengonfigurasi kolom l_orderkey sebagai kunci distribusi.

  • Berikut ini adalah contoh kode untuk membuat tabel lineitem:

    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',-- Tentukan kunci distribusi untuk memungkinkan join lokal.
        clustering_key = 'L_SHIPDATE',-- Tentukan kunci pengelompokan untuk mempercepat penyaringan rentang.
        event_time_column = 'L_SHIPDATE'-- Tentukan kolom waktu kejadian untuk mempercepat pemangkasan file.
      );
    COMMIT;

hologres_dataset_tpch_100g.orders

Dalam contoh ini, tabel orders digunakan dalam TPC-H Q4.

  • Konfigurasikan kolom o_orderkey dalam tabel orders sebagai kunci distribusi untuk memungkinkan join lokal. Ini membantu meningkatkan efisiensi kueri join.

  • Konfigurasikan kolom o_orderdate dalam tabel orders sebagai kolom waktu kejadian untuk mempercepat pemangkasan file. Kolom o_orderdate berisi informasi tanggal dan dapat digunakan untuk penyaringan.

  • Berikut ini adalah contoh kode untuk membuat tabel orders:

    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',-- Tentukan kunci distribusi untuk memungkinkan join lokal.
        event_time_column = 'O_ORDERDATE'-- Tentukan kolom waktu kejadian untuk mempercepat pemangkasan file.
      );
    COMMIT;

Impor data sampel

Gunakan HoloWeb untuk mengimpor 100 GB data dari dataset publik TPC-H ke instance Hologres hanya dengan beberapa klik. Untuk informasi lebih lanjut, lihat Impor Dataset Publik dengan Beberapa Klik.

Perbandingan hasil uji kinerja

Berikut ini adalah hasil uji kinerja sebelum dan sesudah indeks dikonfigurasi untuk tabel.

  • Lingkungan Pengujian

    • Spesifikasi instans: 32 core CPU

    • Tipe jaringan: virtual private cloud (VPC)

    • Lakukan setiap kueri dua kali pada klien PostgreSQL, dan gunakan latensi kueri kedua.

  • Kesimpulan Pengujian

    • Untuk kueri pada tabel tunggal yang melibatkan penyaringan, Anda dapat mengonfigurasi kolom berdasarkan data yang difilter sebagai kolom kunci pengelompokan untuk secara signifikan mempercepat kueri.

    • Untuk kueri join multi-tabel, Anda dapat mengonfigurasi kolom join sebagai kolom kunci distribusi untuk secara signifikan mempercepat operasi join.

    Kueri

    Latensi ketika indeks dikonfigurasi di Hologres

    Latensi ketika indeks tidak dikonfigurasi di Hologres

    Q1

    48.293 ms

    59.483 ms

    Q4

    822.389 ms

    3027.957 ms

Referensi

Baca lebih lanjut

Aktivasi layanan

Impor data

Kueri data

O&M dan pemantauan