All Products
Search
Document Center

Hologres:Instans gudang virtual – panduan cepat

Last Updated:May 20, 2026

Hologres V2.0 memperkenalkan tipe instans baru yang elastis dan berdaya tinggi (HA). Model ini memisahkan sumber daya komputasi menjadi unit-unit independen yang disebut gudang virtual untuk mendukung penerapan HA secara lebih baik. Topik ini menjelaskan cara menggunakan gudang virtual.

Informasi latar belakang

Gudang virtual mendukung berbagai skenario, seperti pemisahan baca/tulis, isolasi resource, dan isolasi workload. Kemampuan intinya mencakup isolasi resource dan elastisitas. Untuk informasi selengkapnya tentang arsitektur gudang virtual, lihat Arsitektur Gudang Virtual.

Prasyarat

Hanya instans Hologres versi V2.0.4 atau yang lebih baru yang mendukung gudang virtual. Jika instans Anda menjalankan versi sebelum V2.0.4, lihat Kesalahan Umum Saat Persiapan Upgrade atau bergabunglah dengan grup DingTalk Hologres untuk dukungan. Untuk informasi selengkapnya, lihat Bagaimana Cara Mendapatkan Dukungan Online Tambahan?.

Buat gudang virtual baru

Bagian ini menjelaskan cara membuat gudang virtual baru bernama read_warehouse_1 untuk menerapkan pemisahan baca/tulis. Gudang virtual init_warehouse digunakan untuk menulis data, sedangkan read_warehouse_1 digunakan untuk kueri layanan.

image..png

Buat database

  1. Login ke HoloWeb sebagai superuser dan buat database bernama erp_database. Untuk informasi selengkapnya, lihat Buat Database.image.png

  2. Setelah login ke database, jalankan pernyataan SQL berikut untuk mengimpor data sampel.

    DROP FOREIGN TABLE IF EXISTS odps_customer_10g;
    DROP FOREIGN TABLE IF EXISTS odps_lineitem_10g;
    DROP FOREIGN TABLE IF EXISTS odps_nation_10g;
    DROP FOREIGN TABLE IF EXISTS odps_orders_10g;
    DROP FOREIGN TABLE IF EXISTS odps_part_10g;
    DROP FOREIGN TABLE IF EXISTS odps_partsupp_10g;
    DROP FOREIGN TABLE IF EXISTS odps_region_10g;
    DROP FOREIGN TABLE IF EXISTS odps_supplier_10g;
    
    
    IMPORT FOREIGN SCHEMA "MAXCOMPUTE_PUBLIC_DATA#default" LIMIT to
    (
        odps_customer_10g,
        odps_lineitem_10g,
        odps_nation_10g,
        odps_orders_10g,
        odps_part_10g,
        odps_partsupp_10g,
        odps_region_10g,
        odps_supplier_10g
    ) 
    FROM SERVER odps_server INTO public OPTIONS(if_table_exist'error',if_unsupported_type'error');
    
    DROP TABLE IF EXISTS LINEITEM;
    
    BEGIN;
    CREATE TABLE 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)
    );
    CALL set_table_property('LINEITEM', 'clustering_key', 'L_SHIPDATE,L_ORDERKEY');
    CALL set_table_property('LINEITEM', 'segment_key', 'L_SHIPDATE');
    CALL set_table_property('LINEITEM', 'distribution_key', 'L_ORDERKEY');
    CALL set_table_property('LINEITEM', 'bitmap_columns', 'L_ORDERKEY,L_PARTKEY,L_SUPPKEY,L_LINENUMBER,L_RETURNFLAG,L_LINESTATUS,L_SHIPINSTRUCT,L_SHIPMODE,L_COMMENT');
    CALL set_table_property('LINEITEM', 'dictionary_encoding_columns', 'L_RETURNFLAG,L_LINESTATUS,L_SHIPINSTRUCT,L_SHIPMODE,L_COMMENT');
    CALL set_table_property('LINEITEM', 'time_to_live_in_seconds', '31536000');
    COMMIT;
    
    DROP TABLE IF EXISTS ORDERS;
    
    BEGIN;
    CREATE TABLE 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
    );
    CALL set_table_property('ORDERS', 'segment_key', 'O_ORDERDATE');
    CALL set_table_property('ORDERS', 'distribution_key', 'O_ORDERKEY');
    CALL set_table_property('ORDERS', 'bitmap_columns', 'O_ORDERKEY,O_CUSTKEY,O_ORDERSTATUS,O_ORDERPRIORITY,O_CLERK,O_SHIPPRIORITY,O_COMMENT');
    CALL set_table_property('ORDERS', 'dictionary_encoding_columns', 'O_ORDERSTATUS,O_ORDERPRIORITY,O_CLERK,O_COMMENT');
    CALL set_table_property('ORDERS', 'time_to_live_in_seconds', '31536000');
    COMMIT;
    
    DROP TABLE IF EXISTS PARTSUPP;
    
    BEGIN;
    CREATE TABLE PARTSUPP
    (
        PS_PARTKEY    INT    NOT NULL,
        PS_SUPPKEY    INT    NOT NULL,
        PS_AVAILQTY   INT    NOT NULL,
        PS_SUPPLYCOST DECIMAL(15,2) NOT NULL,
        PS_COMMENT    TEXT   NOT NULL,
        PRIMARY KEY(PS_PARTKEY,PS_SUPPKEY)
    );
    CALL set_table_property('PARTSUPP', 'distribution_key', 'PS_PARTKEY');
    CALL set_table_property('PARTSUPP', 'colocate_with', 'LINEITEM');
    CALL set_table_property('PARTSUPP', 'bitmap_columns', 'PS_PARTKEY,PS_SUPPKEY,PS_AVAILQTY,PS_COMMENT');
    CALL set_table_property('PARTSUPP', 'dictionary_encoding_columns', 'PS_COMMENT');
    CALL set_table_property('PARTSUPP', 'time_to_live_in_seconds', '31536000');
    COMMIT;
    
    DROP TABLE IF EXISTS PART;
    
    BEGIN;
    CREATE TABLE PART
    (
        P_PARTKEY     INT    NOT NULL PRIMARY KEY,
        P_NAME        TEXT   NOT NULL,
        P_MFGR        TEXT   NOT NULL,
        P_BRAND       TEXT   NOT NULL,
        P_TYPE        TEXT   NOT NULL,
        P_SIZE        INT    NOT NULL,
        P_CONTAINER   TEXT   NOT NULL,
        P_RETAILPRICE DECIMAL(15,2) NOT NULL,
        P_COMMENT     TEXT   NOT NULL
    );
    CALL set_table_property('PART', 'distribution_key', 'P_PARTKEY');
    CALL set_table_property('PART', 'bitmap_columns', 'P_PARTKEY,P_SIZE,P_NAME,P_MFGR,P_BRAND,P_TYPE,P_CONTAINER,P_COMMENT');
    CALL set_table_property('PART', 'dictionary_encoding_columns', 'P_NAME,P_MFGR,P_BRAND,P_TYPE,P_CONTAINER,P_COMMENT');
    CALL set_table_property('PART', 'time_to_live_in_seconds', '31536000');
    COMMIT;
    
    
    
    DROP TABLE IF EXISTS CUSTOMER;
    BEGIN;
    CREATE TABLE CUSTOMER
    (
        C_CUSTKEY    INT    NOT NULL PRIMARY KEY,
        C_NAME       TEXT   NOT NULL,
        C_ADDRESS    TEXT   NOT NULL,
        C_NATIONKEY  INT    NOT NULL,
        C_PHONE      TEXT   NOT NULL,
        C_ACCTBAL    DECIMAL(15,2) NOT NULL,
        C_MKTSEGMENT TEXT   NOT NULL,
        C_COMMENT    TEXT   NOT NULL
    );
    CALL set_table_property('CUSTOMER', 'distribution_key', 'C_CUSTKEY');
    CALL set_table_property('CUSTOMER', 'bitmap_columns', 'C_CUSTKEY,C_NATIONKEY,C_NAME,C_ADDRESS,C_PHONE,C_MKTSEGMENT,C_COMMENT');
    CALL set_table_property('CUSTOMER', 'dictionary_encoding_columns', 'C_NAME,C_ADDRESS,C_PHONE,C_MKTSEGMENT,C_COMMENT');
    CALL set_table_property('CUSTOMER', 'time_to_live_in_seconds', '31536000');
    COMMIT;
    
    DROP TABLE IF EXISTS SUPPLIER;
    
    BEGIN;
    CREATE TABLE SUPPLIER
    (
        S_SUPPKEY   INT    NOT NULL PRIMARY KEY,
        S_NAME      TEXT   NOT NULL,
        S_ADDRESS   TEXT   NOT NULL,
        S_NATIONKEY INT    NOT NULL,
        S_PHONE     TEXT   NOT NULL,
        S_ACCTBAL   DECIMAL(15,2) NOT NULL,
        S_COMMENT   TEXT   NOT NULL
    );
    CALL set_table_property('SUPPLIER', 'distribution_key', 'S_SUPPKEY');
    CALL set_table_property('SUPPLIER', 'bitmap_columns', 'S_SUPPKEY,S_NAME,S_ADDRESS,S_NATIONKEY,S_PHONE,S_COMMENT');
    CALL set_table_property('SUPPLIER', 'dictionary_encoding_columns', 'S_NAME,S_ADDRESS,S_PHONE,S_COMMENT');
    CALL set_table_property('SUPPLIER', 'time_to_live_in_seconds', '31536000');
    COMMIT;
    
    DROP TABLE IF EXISTS NATION;
    
    BEGIN;
    CREATE TABLE NATION(
      N_NATIONKEY INT NOT NULL PRIMARY KEY,
      N_NAME text NOT NULL,
      N_REGIONKEY INT NOT NULL,
      N_COMMENT text NOT NULL
    );
    CALL set_table_property('NATION', 'distribution_key', 'N_NATIONKEY');
    CALL set_table_property('NATION', 'bitmap_columns', 'N_NATIONKEY,N_NAME,N_REGIONKEY,N_COMMENT');
    CALL set_table_property('NATION', 'dictionary_encoding_columns', 'N_NAME,N_COMMENT');
    CALL set_table_property('NATION', 'time_to_live_in_seconds', '31536000');
    COMMIT;
    
    DROP TABLE IF EXISTS REGION;
    
    BEGIN;
    CREATE TABLE REGION
    (
        R_REGIONKEY INT  NOT NULL PRIMARY KEY,
        R_NAME      TEXT NOT NULL,
        R_COMMENT   TEXT
    );
    CALL set_table_property('REGION', 'distribution_key', 'R_REGIONKEY');
    CALL set_table_property('REGION', 'bitmap_columns', 'R_REGIONKEY,R_NAME,R_COMMENT');
    CALL set_table_property('REGION', 'dictionary_encoding_columns', 'R_NAME,R_COMMENT');
    CALL set_table_property('REGION', 'time_to_live_in_seconds', '31536000');
    COMMIT;
    
    INSERT INTO public.customer SELECT * FROM public.odps_customer_10g ;
    INSERT INTO public.lineitem SELECT * FROM public.odps_lineitem_10g ;
    INSERT INTO public.nation SELECT * FROM public.odps_nation_10g ;
    INSERT INTO public.orders SELECT * FROM public.odps_orders_10g ;
    INSERT INTO public.part SELECT * FROM public.odps_part_10g ;
    INSERT INTO public.partsupp SELECT * FROM public.odps_partsupp_10g ;
    INSERT INTO public.region SELECT * FROM public.odps_region_10g ;
    INSERT INTO public.supplier SELECT * FROM public.odps_supplier_10g ;
    
    vacuum nation;
    vacuum region;
    vacuum supplier;
    vacuum customer;
    vacuum part;
    vacuum partsupp;
    vacuum orders;
    vacuum lineitem;
    
    analyze nation;
    analyze region;
    analyze lineitem;
    analyze orders;
    analyze customer;
    analyze part;
    analyze partsupp;
    analyze supplier;
    analyze lineitem (l_orderkey,l_partkey,l_suppkey);
    analyze orders (o_custkey);
    analyze partsupp(ps_partkey,ps_suppkey);

Buat gudang virtual

  1. Login ke Konsol Hologres dan buka halaman detail instans target.

  2. Di panel navigasi kiri, klik Virtual Warehouse Management untuk membuka tab Virtual Warehouse Resource Management. Di tab ini, Anda dapat melihat daftar gudang virtual yang sudah ada.

    jisuan1

  3. Klik Create Virtual Warehouse. Di kotak dialog, masukkan Virtual Warehouse Name dan pilih Virtual Warehouse Resource.

    Dalam skenario ini, buat gudang virtual bernama read_warehouse_1.

    w1

  4. Klik OK.

  5. Di halaman Virtual Warehouse Management, gudang virtual berhasil dibuat jika statusnya di kolom Status adalah Running.

    e33

Muat data ke dalam gudang virtual

Kelompok tabel adalah wadah data di Hologres. Untuk menggunakan gudang virtual dalam kueri, Anda harus terlebih dahulu memuat kelompok tabel yang diperlukan ke dalamnya.

  1. Lihat kelompok tabel di database saat ini.

    Jalankan pernyataan SQL berikut untuk melihat kelompok tabel di database saat ini:

    SELECT tablegroup_name
    FROM hologres.hg_table_group_properties
    GROUP BY tablegroup_name;

    Gambar berikut menunjukkan contoh hasil:image..png

    Hal ini menunjukkan bahwa database saat ini hanya memiliki satu kelompok tabel.

  2. Muat kelompok tabel untuk gudang virtual.

    Untuk menggunakan read_warehouse_1 dalam mengkueri data di kelompok tabel erp_database_tg_default, jalankan pernyataan SQL berikut untuk memuat erp_database_tg_default ke gudang virtual read_warehouse_1:

    CALL hg_table_group_load_to_warehouse('erp_database.erp_database_tg_default', 'read_warehouse_1', 1);
  3. Periksa kelompok tabel yang telah dimuat.

    SELECT * FROM hologres.hg_warehouse_table_groups;

    Gambar berikut menunjukkan contoh hasil:image..png

    Hasil tersebut menunjukkan bahwa read_warehouse_1 telah memuat kelompok tabel erp_database_tg_default.

Atur izin pengguna

Secara default, pengguna tidak dapat mengakses gudang virtual baru hingga Anda memberikan izin kepada mereka. Contoh berikut menunjukkan cara memberikan akses kepada Pengguna RAM bernama ram_test ke gudang virtual read_warehouse_1.

  1. Lihat izin gudang virtual pengguna.

    SELECT * FROM hologres.hg_warehouse_users;
  2. Lihat gudang virtual default pengguna.

    SELECT * FROM hologres.hg_user_default_warehouse;
  3. Tambahkan pengguna ke instans.

    Di halaman Users di HoloWeb, tambahkan Pengguna RAM ke instans Hologres. Untuk informasi selengkapnya, lihat Manajemen Pengguna.

    image..png

  4. Berikan izin kueri kepada pengguna ram_test pada database erp_database.

    Di halaman Database authorization di HoloWeb, berikan izin kueri pada database kepada pengguna ram_test. Untuk informasi selengkapnya, lihat Berikan Izin kepada Pengguna RAM.image..png

  5. Berikan akses pengguna ram_test ke gudang virtual read_warehouse_1.

    CALL hg_grant_warehouse_access_privilege ('read_warehouse_1', '"p4_2xxxxxxxxxxxxxxx"');

    Untuk penjelasan parameter, lihat Otorisasi Pengguna untuk Menggunakan Gudang Virtual.

  6. Tetapkan read_warehouse_1 sebagai gudang virtual default untuk pengguna ram_test.

    Untuk menerapkan pemisahan baca/tulis, pengguna ram_test harus terhubung ke Hologres menggunakan sumber daya read_warehouse_1 alih-alih init_warehouse. Jalankan perintah berikut untuk menetapkan read_warehouse_1 sebagai gudang virtual default bagi pengguna ram_test:

    CALL hg_set_user_default_warehouse('"p4_2xxxxxxxxxxxxxxx"', 'read_warehouse_1');
  7. Periksa gudang virtual yang digunakan oleh akun saat ini.

    Setelah Anda terhubung ke instans sebagai pengguna ram_test, jalankan perintah berikut untuk memverifikasi bahwa Anda menggunakan gudang virtual read_warehouse_1:

    SELECT current_warehouse();

Mengalihkan traffic antar gudang virtual

Jika Anda menemukan bahwa gudang virtual baru read_warehouse_1 mengalami gangguan setelah dibuat, Anda harus mengalihkan traffic dari akun ram_test ke gudang virtual init_warehouse.

image..png

Penting
  • Pengalihan traffic hanya berlaku setelah Anda terhubung ulang ke instans. Pastikan aplikasi Anda yang terhubung ke Hologres memiliki mekanisme reconnect.

  • Saat terhubung ke Hologres, gunakan logika routing otomatisnya. Jangan menentukan nama gudang virtual di string koneksi.

  1. Berikan akses pengguna ram_test ke gudang virtual init_warehouse.

    Jika sebelumnya Anda belum memberikan izin untuk init_warehouse kepada ram_test, jalankan perintah berikut untuk memberikan izin kepada pengguna ram_test atas gudang virtual init_warehouse, sehingga pengguna ram_test dapat menggunakan sumber daya init_warehouse.

    CALL hg_grant_warehouse_access_privilege('init_warehouse', '"p4_2xxxxxxxxxxxxxxx"');
  2. Tetapkan init_warehouse sebagai gudang virtual default untuk pengguna ram_test.

    Jalankan perintah berikut untuk menetapkan gudang virtual default pengguna ram_test menjadi init_warehouse. Koneksi baru dari pengguna tersebut kemudian akan menggunakan gudang virtual init_warehouse.

    CALL hg_set_user_default_warehouse('"p4_2xxxxxxxxxxxxxxx"', 'init_warehouse');
  3. Hentikan koneksi yang tidak menggunakan gudang virtual default.

    SELECT hg_kill_non_default_warehouse_connections(); 
  4. Setelah terhubung ulang, koneksi baru Anda akan menggunakan gudang virtual default.