全部产品
Search
文档中心

Hologres:Panduan Cepat untuk instans virtual warehouse

更新时间:Feb 05, 2026

Hologres V2.0 memperkenalkan tipe instans baru yang elastis dan berdaya tinggi (HA). Tipe instans ini membagi sumber daya komputasi ke dalam beberapa virtual warehouse—disebut Virtual Warehouses—untuk mendukung penerapan HA secara lebih baik. Topik ini menjelaskan cara menggunakan virtual warehouse.

Latar Belakang

Virtual warehouse mendukung berbagai skenario, seperti pemisahan baca/tulis, isolasi resource, dan isolasi layanan. Fitur utamanya mencakup isolasi resource dan elastisitas. Untuk informasi lebih lanjut mengenai arsitektur virtual warehouse, lihat Arsitektur.

Perhatian

Hanya Hologres V2.0.4 dan versi yang lebih baru yang mendukung instans virtual warehouse. Jika instans Anda lebih lama dari V2.0.4, lihat Kesalahan umum selama persiapan upgrade atau bergabunglah dengan grup DingTalk Hologres untuk memberikan masukan. Untuk informasi lebih lanjut, lihat Bagaimana cara mendapatkan dukungan online tambahan?.

Buat instans virtual warehouse

Bagian ini menunjukkan cara membuat virtual warehouse baru bernama read_warehouse_1 untuk menerapkan pemisahan baca/tulis. Virtual warehouse init_warehouse digunakan untuk menulis data, sedangkan virtual warehouse 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 lebih lanjut, 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. Pada panel navigasi di sebelah kiri, klik Virtual Warehouse Management dan buka tab Virtual Warehouse Resource Management. Pada tab ini, Anda dapat melihat daftar virtual warehouse yang ada.

    jisuan1

  3. Klik Create Virtual Warehouse. Pada kotak dialog Add virtual warehouse, masukkan Virtual Warehouse Name dan pilih Virtual Warehouse Resource.

    Dalam skenario ini, virtual warehouse bernama read_warehouse_1 dibuat:

    w1

  4. Klik OK untuk menyelesaikan pembuatan.

  5. Pada halaman Virtual Warehouse Management, lihat status virtual warehouse. Saat nilai pada kolom Status adalah Running, virtual warehouse telah berhasil dibuat.

    e33

Memuat data ke dalam gudang virtual

Kelompok tabel (table group) merupakan wadah data di Hologres. Secara default, virtual warehouse baru tidak dapat mengakses kelompok tabel apa pun. Untuk menggunakan virtual warehouse dalam mengkueri data, Anda harus terlebih dahulu memberikan izin virtual warehouse tersebut pada kelompok tabel yang diperlukan.

  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 virtual warehouse.

    Anda perlu menggunakan read_warehouse_1 untuk mengkueri data di kelompok tabel erp_database_tg_default. Untuk melakukannya, jalankan pernyataan SQL berikut untuk memuat erp_database_tg_default ke virtual warehouse read_warehouse_1:

    CALL hg_table_group_load_to_warehouse('erp_database.erp_database_tg_default', 'read_warehouse_1', 1);
  3. Lihat kelompok tabel yang telah dimuat untuk virtual warehouse.

    SELECT * FROM hologres.hg_warehouse_table_groups;

    Gambar berikut menunjukkan contoh hasil:image..png

    Hal ini menunjukkan bahwa read_warehouse_1 telah memuat data dari kelompok tabel erp_database_tg_default.

Atur izin pengguna

Secara default, pengguna yang tidak memiliki izin tidak dapat mengakses virtual warehouse baru. Untuk mengizinkan akun lain mengakses virtual warehouse, Anda harus memberikan izin kepada mereka. Contoh berikut menunjukkan cara memberikan izin kepada pengguna Resource Access Management (RAM) ram_test agar dapat mengakses virtual warehouse read_warehouse_1:

  1. Lihat izin virtual warehouse pengguna.

    SELECT * FROM hologres.hg_warehouse_users;
  2. Lihat informasi tentang virtual warehouse default pengguna.

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

    Pada halaman Users di HoloWeb, tambahkan pengguna RAM ke instans Hologres. Untuk informasi lebih lanjut, lihat Manajemen pengguna.

    image..png

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

    Pada halaman DB Authorization di HoloWeb, berikan izin kueri kepada pengguna ram_test pada database tersebut. Untuk informasi lebih lanjut, lihat Panduan Cepat pemberian izin kepada pengguna RAM.image..png

  5. Berikan izin kepada pengguna ram_test pada virtual warehouse read_warehouse_1.

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

    Untuk deskripsi parameter, lihat Berikan otorisasi kepada pengguna untuk menggunakan virtual warehouse.

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

    Untuk menerapkan pemisahan baca/tulis, pengguna ram_test harus terhubung ke Hologres dan menggunakan sumber daya read_warehouse_1 alih-alih init_warehouse. Untuk melakukannya, jalankan perintah berikut untuk menetapkan virtual warehouse default bagi pengguna ram_test menjadi read_warehouse_1:

    CALL hg_set_user_default_warehouse('p4_2xxxxxxxxxxxxxxx', 'read_warehouse_1');
  7. Lihat virtual warehouse yang sedang digunakan oleh akun saat ini.

    Saat Anda terhubung ke instans sebagai pengguna ram_test, jalankan perintah berikut untuk memverifikasi bahwa virtual warehouse read_warehouse_1 digunakan:

    SELECT current_warehouse();

Alihkan traffic antar virtual warehouse

Setelah Anda membuat virtual warehouse baru read_warehouse_1, Anda mungkin menemukan bahwa virtual warehouse tersebut mengalami gangguan. Jika hal ini terjadi, Anda perlu mengalihkan traffic akun ram_test ke virtual warehouse init_warehouse.

image..png

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

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

  1. Berikan izin kepada pengguna ram_test pada virtual warehouse init_warehouse.

    Jika Anda belum memberikan izin init_warehouse kepada pengguna ram_test, jalankan perintah berikut untuk memberikan izin pada virtual warehouse init_warehouse kepada pengguna ram_test. Hal ini memungkinkan pengguna ram_test menggunakan sumber daya init_warehouse.

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

    Jalankan perintah berikut untuk menetapkan virtual warehouse default pengguna ram_test menjadi init_warehouse. Setelah pengaturan ini diterapkan, koneksi baru dari pengguna ke instans akan menggunakan sumber daya virtual warehouse init_warehouse.

    CALL hg_set_user_default_warehouse('p4_2xxxxxxxxxxxxxxx', 'init_warehouse');
  3. Putuskan semua koneksi pengguna yang tidak berada di virtual warehouse default.

    SELECT hg_kill_non_default_warehouse_connections(); 
  4. Setelah melakukan koneksi ulang, virtual warehouse default yang baru akan digunakan untuk terhubung ke instans.