すべてのプロダクト
Search
ドキュメントセンター

Hologres:Quickstart for virtual warehouse instances

最終更新日:Feb 05, 2026

Hologres V2.0 では、新しい弾力性のある高可用性 (HA) インスタンスタイプが導入されました。このインスタンスタイプは、コンピューティングリソースを異なる仮想ウェアハウス (Virtual Warehouses) に分割し、HA デプロイメントをより適切にサポートします。このトピックでは、仮想ウェアハウスの使用方法について説明します。

背景情報

仮想ウェアハウスは、読み書き分離、リソース隔離、サービス隔離など、複数のシナリオをサポートします。これらは、リソース隔離と弾力性を含むコア機能を提供します。仮想ウェアハウスのアーキテクチャの詳細については、「アーキテクチャ」をご参照ください。

注意事項

Hologres V2.0.4 以降のみが仮想ウェアハウスインスタンスをサポートしています。ご利用のインスタンスが V2.0.4 より前の場合は、スペックアップ準備中の一般的なエラー」をご参照いただくか、Hologres DingTalk グループに参加してフィードバックを提供してください。詳細については、「オンラインサポートをさらに利用するには」をご参照ください。

仮想ウェアハウスインスタンスの作成

このセクションでは、読み書き分離を実装するために、read_warehouse_1 という名前の新しい仮想ウェアハウスを作成する方法について説明します。仮想ウェアハウス init_warehouse はデータの書き込みに使用され、仮想ウェアハウス read_warehouse_1 はサービスクエリに使用されます。

image..png

データベースの作成

  1. スーパーユーザとして HoloWeb にログインし、erp_database という名前のデータベースを作成します。詳細については、「データベースの作成」をご参照ください。image.png

  2. データベースにログインした後、以下の SQL ステートメントを実行してサンプルデータをインポートします。

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

仮想ウェアハウスの作成

  1. Hologres コンソールにログインし、ターゲットインスタンスの詳細ページに移動します。

  2. 左側のナビゲーションウィンドウで、計算グループ管理 をクリックし、仮想ウェアハウスリソース管理 タブに移動します。このタブでは、既存の仮想ウェアハウスのリストを表示できます。

    jisuan1

  3. 仮想ウェアハウスの新規追加」をクリックします。仮想ウェアハウスの追加ダイアログボックスで、「Virtual Warehouse Name」に入力し、「Virtual Warehouse Resource」を選択します。

    このシナリオでは、read_warehouse_1 という名前の仮想ウェアハウスが作成されます:

    w1

  4. OK をクリックして作成を完了します。

  5. 計算グループ管理 ページで、仮想ウェアハウスのステータスを確認します。Status 列の値が 現在実行中 の場合、仮想ウェアハウスは作成されています。

    e33

仮想ウェアハウスへのデータロード

テーブルグループは Hologres のデータコンテナです。デフォルトでは、新しい仮想ウェアハウスはどのテーブルグループにもアクセスできません。仮想ウェアハウスを使用してデータをクエリするには、まず仮想ウェアハウスに必要なテーブルグループへの権限を付与する必要があります。

  1. 現在のデータベース内のテーブルグループを表示します。

    現在のデータベース内のテーブルグループを表示するには、以下の SQL ステートメントを実行します。

    SELECT tablegroup_name
    FROM hologres.hg_table_group_properties
    GROUP BY tablegroup_name;

    以下にサンプル結果を示します。image..png

    これは、現在のデータベースにテーブルグループが 1 つしかないことを示しています。

  2. 仮想ウェアハウスにテーブルグループをロードします。

    read_warehouse_1 を使用して、erp_database_tg_default テーブルグループ内のデータをクエリする必要があります。これを行うには、以下の SQL ステートメントを実行して、read_warehouse_1 仮想ウェアハウスに erp_database_tg_default をロードします。

    CALL hg_table_group_load_to_warehouse('erp_database.erp_database_tg_default', 'read_warehouse_1', 1);
  3. 仮想ウェアハウスにロードされたテーブルグループを表示します。

    SELECT * FROM hologres.hg_warehouse_table_groups;

    以下にサンプル結果を示します。image..png

    これは、read_warehouse_1erp_database_tg_default テーブルグループからデータをロードしたことを示しています。

ユーザー権限の設定

デフォルトでは、未承認ユーザーは新しい仮想ウェアハウスにアクセスできません。他のアカウントが仮想ウェアハウスにアクセスできるようにするには、それらのアカウントに権限を付与する必要があります。次の例では、ram_test リソースアクセス管理 (RAM) ユーザーに read_warehouse_1 仮想ウェアハウスへのアクセス権限を付与する方法を示します。

  1. ユーザーの仮想ウェアハウス権限を表示します。

    SELECT * FROM hologres.hg_warehouse_users;
  2. ユーザーのデフォルト仮想ウェアハウスに関する情報を表示します。

    SELECT * FROM hologres.hg_user_default_warehouse;
  3. インスタンスへのユーザー追加。

    HoloWeb の Users ページで、RAM ユーザーを Hologres インスタンスに追加します。詳細については、「ユーザー管理」をご参照ください。

    image..png

  4. ram_test ユーザーに erp_database データベースに対するクエリ権限を付与します。

    HoloWeb の [DB 権限付与] ページで、ram_test ユーザーにデータベースに対するクエリ権限を付与します。詳細については、「RAM ユーザーへの権限付与のクイックスタート」をご参照ください。イメージ..png

  5. ram_test ユーザーに [read_warehouse_1] 仮想ウェアハウスの権限を付与します。

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

    パラメーターの説明については、「仮想ウェアハウスを使用するためのユーザー承認」をご参照ください。

  6. [read_warehouse_1] 仮想ウェアハウスを、ram_test ユーザーのデフォルトの仮想ウェアハウスとして設定します。

    読み書き分離を実装するには、ram_test ユーザーは Hologres に接続し、init_warehouse の代わりに read_warehouse_1 のリソースを使用する必要があります。 これを行うには、次のコマンドを実行して、ram_test のデフォルトの仮想ウェアハウスを read_warehouse_1 に設定します。

    CALL hg_set_user_default_warehouse('p4_2xxxxxxxxxxxxxxx', 'read_warehouse_1');
  7. 現在のアカウントが使用している仮想ウェアハウスを表示します。

    インスタンスに ram_test ユーザーとして接続した後、次のコマンドを実行して、read_warehouse_1 仮想ウェアハウスが使用されていることを確認します:

    SELECT current_warehouse();

仮想ウェアハウス間のトラフィック切り替え

新しい read_warehouse_1 仮想ウェアハウスを作成した後、エラーが発生している場合があります。このような場合は、ram_test アカウントのトラフィックを init_warehouse 仮想ウェアハウスに切り替える必要があります。

image..png

重要
  • トラフィックの切り替えは、再接続後にのみ有効になります。Hologres に接続するアプリケーションに再接続メカニズムがあることを確認してください。

  • Hologres に接続するときは、その自動ルーティングロジックを使用してください。接続文字列に仮想ウェアハウス名を指定しないでください。

  1. ram_test ユーザーに init_warehouse 仮想ウェアハウスの権限を付与します。

    ram_testinit_warehouse の権限が付与されていない場合、次のコマンドを実行して、ram_test ユーザーに init_warehouse 仮想ウェアハウスの権限を付与します。これにより、ram_test ユーザーは init_warehouse のリソースを使用できるようになります。

    CALL hg_grant_warehouse_access_privilege('init_warehouse', 'p4_2xxxxxxxxxxxxxxx');
  2. init_warehouse 仮想ウェアハウスを ram_test ユーザーのデフォルトの仮想ウェアハウスとして設定します。

    次のコマンドを実行して、ram_test ユーザーのデフォルトの仮想ウェアハウスを [init_warehouse] に設定します。この設定後、ユーザーからインスタンスへの新しい接続は、[init_warehouse] 仮想ウェアハウスのリソースを使用します。

    CALL hg_set_user_default_warehouse('p4_2xxxxxxxxxxxxxxx', 'init_warehouse');
  3. デフォルト仮想ウェアハウスにないすべてのユーザー接続を切断します。

    SELECT hg_kill_non_default_warehouse_connections(); 
  4. 再接続後、新しいデフォルト仮想ウェアハウスがインスタンスへの接続に使用されます。