全部产品
Search
文档中心

Hologres:Mode penyimpanan tabel: penyimpanan berorientasi baris, penyimpanan berorientasi kolom, dan penyimpanan hibrida baris-kolom

更新时间:Jul 02, 2025

Hologres mendukung penyimpanan berorientasi baris, kolom, dan hibrida baris-kolom. Mode penyimpanan yang berbeda cocok untuk skenario yang berbeda. Anda dapat menentukan mode penyimpanan berdasarkan kebutuhan tabel, meningkatkan efisiensi pemrosesan data dan kueri serta menghemat ruang penyimpanan.

Sintaksis

Hologres mendukung penyimpanan berorientasi baris, kolom, dan hibrida baris-kolom. Saat membuat tabel, Anda dapat menentukan mode penyimpanan dengan mengonfigurasi properti orientation. Sintaksis:

-- Sintaksis yang didukung di Hologres V2.1 dan versi lebih baru:
CREATE TABLE <table_name> (...) WITH (orientation = '[column | row | row,column]');

-- Sintaksis yang didukung di semua versi Hologres:
BEGIN;
CREATE TABLE <table_name> (...);
CALL set_table_property('<table_name>', 'orientation', '[column | row | row,column]');
COMMIT;

table_name: nama tabel.

Catatan
  • orientation: menentukan mode penyimpanan tabel di Hologres. Penyimpanan hibrida baris-kolom didukung mulai Hologres V1.1.

  • Secara default, mode penyimpanan berorientasi kolom digunakan saat tabel dibuat. Untuk menggunakan mode penyimpanan berorientasi baris atau hibrida baris-kolom, Anda harus menentukannya secara eksplisit. Mode penyimpanan tabel yang sudah ada tidak dapat diubah; Anda perlu membuat tabel baru untuk mengubah mode penyimpanan.

Saran

Berikut adalah rekomendasi untuk memilih mode penyimpanan yang sesuai.

Mode penyimpanan

Skema

Jumlah maksimum kolom yang direkomendasikan

Deskripsi

Penyimpanan berorientasi kolom

Mode penyimpanan berorientasi kolom cocok untuk skenario pemrosesan analitik online (OLAP) dan mendukung kueri kompleks, asosiasi data, pemindaian, penyaringan, dan pengumpulan statistik.

300

Secara default, lebih banyak indeks dibuat untuk tabel berorientasi kolom. Sebagai contoh, indeks bitmap dibuat untuk kolom tipe STRING. Indeks ini dapat secara signifikan mempercepat penyaringan data dan pengumpulan statistik dalam kueri.

Penyimpanan berorientasi baris

Mode penyimpanan berorientasi baris cocok untuk kueri titik berdasarkan kunci utama. Contoh pernyataan kueri:

SELECT * FROM <tablename> WHERE pk =xxx;

3.000

Secara default, indeks hanya dibuat untuk kolom kunci utama pada tabel berorientasi baris. Dalam hal ini, hanya kueri berdasarkan kunci utama yang dapat dipercepat.

Penyimpanan hibrida baris-kolom

Mode penyimpanan hibrida baris-kolom cocok untuk semua skenario di mana mode penyimpanan berorientasi kolom dan berorientasi baris dapat digunakan dan kueri titik yang tidak berdasarkan kunci utama.

300

Mode penyimpanan hibrida baris-kolom cocok untuk berbagai skenario yang lebih luas. Namun, lebih banyak overhead diperlukan dalam mode ini, seperti overhead penyimpanan dan sinkronisasi status data internal.

Cara kerjanya

Penyimpanan berorientasi kolom

Pada mode penyimpanan berorientasi kolom, data disimpan dalam kolom. Secara default, tabel berorientasi kolom menggunakan format ORC dan menerapkan algoritma pengkodean seperti run length encoding (RLE) dan pengkodean kamus. Data kemudian dikompres menggunakan algoritma utama seperti SNAPPY, ZLIB, ZSTD, dan LZ4. Dengan indeks bitmap dan materialisasi tertunda, efisiensi penyimpanan dan kinerja kueri dapat ditingkatkan.

Sistem menyimpan file indeks kunci utama di lapisan bawah untuk setiap tabel. Untuk informasi lebih lanjut, lihat Kunci Utama. Jika kunci utama dikonfigurasikan, sistem menghasilkan pengenal baris (RID) untuk mempercepat pencarian seluruh baris data. Indeks tambahan seperti kunci distribusi dan kluster juga dapat digunakan untuk mempercepat kueri. Mode ini cocok untuk skenario OLAP. Contoh kode:

  • Sintaksis pembuatan tabel yang didukung di Hologres V2.1 dan versi lebih baru:

    CREATE TABLE public.tbl_col (
        id TEXT NOT NULL,
        name TEXT NOT NULL,
        class TEXT NOT NULL,
        in_time TIMESTAMPTZ NOT NULL,
        PRIMARY KEY (id)
    )
    WITH (
        orientation = 'column',
        clustering_key = 'class',
        bitmap_columns = 'name',
      	event_time_column = 'in_time'
    );
    SELECT * FROM public.tbl_col WHERE id ='3333';
    SELECT id, class,name FROM public.tbl_col WHERE id < '3333' ORDER BY id;
  • Sintaksis pembuatan tabel yang didukung di semua versi Hologres:

    BEGIN;
    CREATE TABLE public.tbl_col (
    id TEXT NOT NULL,
    name TEXT NOT NULL,
    class TEXT NOT NULL,
    in_time TIMESTAMPTZ NOT NULL,
    PRIMARY KEY (id)
    );
    CALL set_table_property('public.tbl_col', 'orientation', 'column');
    CALL set_table_property('public.tbl_col', 'clustering_key', 'class');
    CALL set_table_property('public.tbl_col', 'bitmap_columns', 'name');
    CALL set_table_property('public.tbl_col', 'event_time_column', 'in_time');
    COMMIT;
    SELECT * FROM public.tbl_col WHERE id ='3333';
    SELECT id, class,name FROM public.tbl_col WHERE id < '3333' ORDER BY id;

Gambar berikut menunjukkan model penyimpanan.image

Penyimpanan berorientasi baris

Pada mode penyimpanan berorientasi baris, data disimpan dalam baris. Secara default, tabel berorientasi baris menggunakan format SST. Data dikompres dan disimpan dalam blok berdasarkan kunci secara berurutan, dengan dukungan indeks seperti indeks blok, filter Bloom, dan mekanisme kompaksi latar belakang untuk meningkatkan efisiensi kueri titik.

  • Direkomendasikan: Konfigurasikan kunci utama.

    Sistem menyimpan file indeks kunci utama di lapisan bawah untuk setiap tabel. Untuk informasi lebih lanjut, lihat Kunci Utama. Jika kunci utama dikonfigurasikan, sistem menghasilkan RID untuk mempercepat pencarian seluruh baris data. Kunci utama juga diatur sebagai kunci distribusi dan kluster untuk meningkatkan kinerja kueri. Contoh kode:

    • Sintaksis pembuatan tabel yang didukung di Hologres V2.1 dan versi lebih baru:

      CREATE TABLE public.tbl_row (
          id TEXT NOT NULL,
          name TEXT NOT NULL,
          class TEXT,
          PRIMARY KEY (id)
      )
      WITH (
          orientation = 'row',
          clustering_key = 'id',
          distribution_key = 'id'
      );
      -- Lakukan kueri titik berdasarkan kunci utama.
      SELECT * FROM public.tbl_row WHERE id ='1111';
      
      -- Kueri data berdasarkan beberapa kunci.
      SELECT * FROM public.tbl_row WHERE id IN ('1111','2222','3333');
    • Sintaksis pembuatan tabel yang didukung di semua versi Hologres:

      BEGIN;
      CREATE TABLE public.tbl_row (
          id TEXT NOT NULL,
          name TEXT NOT NULL,
          class TEXT ,
      PRIMARY KEY (id)
      );
      CALL set_table_property('public.tbl_row', 'orientation', 'row');
      CALL set_table_property('public.tbl_row', 'clustering_key', 'id');
      CALL set_table_property('public.tbl_row', 'distribution_key', 'id');
      COMMIT;
      
      -- Lakukan kueri titik berdasarkan kunci utama.
      SELECT * FROM public.tbl_row WHERE id ='1111';
      
      -- Kueri data berdasarkan beberapa kunci.
      SELECT * FROM public.tbl_row WHERE id IN ('1111','2222','3333');

    Gambar berikut menunjukkan model penyimpanan.

    行存示意图

  • (Tidak direkomendasikan) Atur kunci utama dan kunci kluster ke kolom yang berbeda.

    Jika Anda menentukan tabel sebagai berorientasi baris dan mengatur kunci utama dan kluster ke kolom yang berbeda, sistem akan memindai tabel dua kali selama kueri, yang dapat mengganggu kinerja. Contoh kode:

    • Sintaksis pembuatan tabel berorientasi baris dengan kunci utama dan kluster berbeda untuk Hologres V2.1 dan versi lebih baru:

      CREATE TABLE public.tbl_row (
          id TEXT NOT NULL,
          name TEXT NOT NULL,
          class TEXT,
          PRIMARY KEY (id)
      )
      WITH (
          orientation = 'row',
          clustering_key = 'name',
          distribution_key = 'id'
      );
    • Sintaksis pembuatan tabel berorientasi baris dengan kunci utama dan kluster berbeda untuk semua versi Hologres:

      BEGIN;
      CREATE TABLE public.tbl_row (
          id TEXT NOT NULL,
          name TEXT NOT NULL,
          class TEXT ,
      PRIMARY KEY (id)
      );
      CALL set_table_property('public.tbl_row', 'orientation', 'row');
      CALL set_table_property('public.tbl_row', 'clustering_key', 'name');
      CALL set_table_property('public.tbl_row', 'distribution_key', 'id');
      COMMIT;

    Gambar berikut menunjukkan model penyimpanan.

    行存示意图2

Secara keseluruhan, tabel berorientasi baris cocok untuk kueri titik berdasarkan kunci utama dengan permintaan per detik (QPS) tinggi. Kami merekomendasikan agar Anda hanya mengonfigurasikan kunci utama saat membuat tabel. Setelah kunci utama dikonfigurasikan, sistem secara otomatis mengaturnya sebagai kunci distribusi dan kluster untuk meningkatkan kinerja kueri. Hindari mengatur kunci utama dan kluster ke kolom yang berbeda karena dapat mengganggu kinerja.

Penyimpanan hibrida baris-kolom

Dalam praktiknya, sebuah tabel mungkin digunakan baik untuk kueri titik berdasarkan kunci utama maupun kueri OLAP. Oleh karena itu, Hologres V1.1 dan versi lebih baru mendukung penyimpanan hibrida baris-kolom. Mode ini menggabungkan manfaat dari penyimpanan berorientasi baris dan kolom, mendukung kinerja tinggi untuk kedua jenis kueri. Data disimpan secara duplikat, satu dalam baris dan satu dalam kolom, meningkatkan overhead penyimpanan.

  • Saat menulis data, data ditulis dalam baris dan kolom secara bersamaan. Pesan sukses hanya dikembalikan jika penulisan data berhasil dilakukan pada kedua mode. Ini memastikan atomicitas data.

  • Saat mengkueri data, pengoptimal menghasilkan rencana eksekusi berdasarkan pernyataan SQL yang dijalankan. Mesin kueri menentukan apakah akan menggunakan penyimpanan berorientasi baris atau kolom berdasarkan efisiensi kueri. Kunci utama harus ditentukan untuk tabel yang menggunakan penyimpanan hibrida baris-kolom.

    • Untuk kueri titik berdasarkan kunci utama seperti select * from tbl where pk=xxx, rencana eksekusi default menggunakan mode penyimpanan berorientasi baris. Untuk informasi lebih lanjut tentang rencana tetap, lihat Percepat Eksekusi Pernyataan SQL dengan Menggunakan Rencana Tetap.

    • Untuk kueri titik berdasarkan kolom umum bukan kunci utama seperti select * from tbl where col1=xx and col2=yyy, sistem pertama-tama membaca data dalam mode penyimpanan berorientasi kolom untuk mendapatkan nilai kunci, kemudian mengkueri data dalam mode penyimpanan berorientasi baris berdasarkan nilai kunci. Ini mencegah pemindaian tabel penuh dan meningkatkan kinerja kueri, terutama ketika tabel memiliki banyak kolom.

    • Untuk skenario kueri lainnya, mode penyimpanan berorientasi kolom digunakan secara default.

Penyimpanan hibrida baris-kolom memberikan efisiensi tinggi dalam kueri umum, terutama kueri titik yang tidak berdasarkan kunci utama. Contoh kode:

  • Sintaksis pembuatan tabel yang didukung di Hologres V2.1 dan versi lebih baru:

    CREATE TABLE public.tbl_row_col (
        id TEXT NOT NULL,
        name TEXT NOT NULL,
        class TEXT NOT NULL,
        PRIMARY KEY (id)
    )
    WITH (
        orientation = 'row,column',
        distribution_key = 'id',
        clustering_key = 'class',
        bitmap_columns = 'name'
    );
    
    SELECT * FROM public.tbl_row_col WHERE id ='2222'; -- Kueri titik berdasarkan kunci utama.
    SELECT * FROM public.tbl_row_col WHERE class='Class 2'; -- Kueri titik yang tidak berdasarkan kunci utama.
    SELECT * FROM public.tbl_row_col WHERE id ='2222' AND class='Class 2'; -- Kueri OLAP umum.
  • Sintaksis pembuatan tabel yang didukung di semua versi Hologres:

    BEGIN;
    CREATE TABLE public.tbl_row_col (
    id TEXT NOT NULL,
    name TEXT NOT NULL,
    class TEXT ,
    PRIMARY KEY (id)
    );
    CALL set_table_property('public.tbl_row_col', 'orientation','row,column');
    CALL set_table_property('public.tbl_row_col', 'distribution_key','id');
    CALL set_table_property('public.tbl_row_col', 'clustering_key','name');
    CALL set_table_property('public.tbl_row_col', 'bitmap_columns','class');
    COMMIT;
    
    SELECT * FROM public.tbl_row_col WHERE id ='2222'; -- Kueri titik berdasarkan kunci utama.
    SELECT * FROM public.tbl_row_col WHERE class='Class 2'; -- Kueri titik yang tidak berdasarkan kunci utama.
    SELECT * FROM public.tbl_row_col WHERE id ='2222' AND class='Class 2 '; -- Kueri OLAP umum.

Gambar berikut menunjukkan model penyimpanan. 行列共存

Contoh

Berikut adalah contoh sintaksis untuk membuat tabel dengan mode penyimpanan yang berbeda.

  • Sintaksis pembuatan tabel yang didukung di Hologres V2.1 dan versi lebih baru:

    -- Buat tabel berorientasi baris.
    CREATE TABLE public.tbl_row (
        a INTEGER NOT NULL,
        b TEXT NOT NULL,
        PRIMARY KEY (a)
    )
    WITH (
        orientation = 'row'
    );
    
    -- Buat tabel berorientasi kolom.
    CREATE TABLE tbl_col (
        a INT NOT NULL,
        b TEXT NOT NULL
    )
    WITH (
        orientation = 'column'
    );
    
    -- Buat tabel hibrida baris-kolom.
    CREATE TABLE tbl_col_row (
        pk TEXT NOT NULL,
        col1 TEXT,
        col2 TEXT,
        col3 TEXT,
        PRIMARY KEY (pk)
    )
    WITH (
        orientation = 'row,column'
    );
  • Sintaksis pembuatan tabel yang didukung di semua versi Hologres:

    -- Buat tabel berorientasi baris.
    BEGIN;
    CREATE TABLE public.tbl_row (
        a INTEGER NOT NULL,
        b TEXT NOT NULL,
        PRIMARY KEY (a)
    );
    CALL set_table_property('public.tbl_row', 'orientation', 'row');
    COMMIT;
    
    -- Buat tabel berorientasi kolom.
    BEGIN;
    CREATE TABLE tbl_col (
      a INT NOT NULL, 
      b TEXT NOT NULL);
    CALL set_table_property('tbl_col', 'orientation', 'column');
    COMMIT;
    
    -- Buat tabel hibrida baris-kolom.
    BEGIN;
    CREATE TABLE tbl_col_row (
    	pk  TEXT NOT NULL, 
    	col1 TEXT, 
    	col2 TEXT, 
    	col3 TEXT, 
    	PRIMARY KEY (pk)); 
    CALL set_table_property('tbl_col_row', 'orientation', 'row,column');
    COMMIT;

Referensi

Untuk informasi lebih lanjut tentang cara mengonfigurasi properti tabel berdasarkan skenario kueri bisnis, lihat Panduan Pembuatan dan Penyetelan Tabel Berdasarkan Skenario.