Hologres V2.0 では、新しい弾力性のある高可用性 (HA) インスタンスタイプが導入されました。このインスタンスタイプは、コンピューティングリソースを異なる仮想ウェアハウス (Virtual Warehouses) に分割し、HA デプロイメントをより適切にサポートします。このトピックでは、仮想ウェアハウスの使用方法について説明します。
背景情報
仮想ウェアハウスは、読み書き分離、リソース隔離、サービス隔離など、複数のシナリオをサポートします。これらは、リソース隔離と弾力性を含むコア機能を提供します。仮想ウェアハウスのアーキテクチャの詳細については、「アーキテクチャ」をご参照ください。
注意事項
Hologres V2.0.4 以降のみが仮想ウェアハウスインスタンスをサポートしています。ご利用のインスタンスが V2.0.4 より前の場合は、「スペックアップ準備中の一般的なエラー」をご参照いただくか、Hologres DingTalk グループに参加してフィードバックを提供してください。詳細については、「オンラインサポートをさらに利用するには」をご参照ください。
仮想ウェアハウスインスタンスの作成
このセクションでは、読み書き分離を実装するために、read_warehouse_1 という名前の新しい仮想ウェアハウスを作成する方法について説明します。仮想ウェアハウス init_warehouse はデータの書き込みに使用され、仮想ウェアハウス read_warehouse_1 はサービスクエリに使用されます。

データベースの作成
スーパーユーザとして HoloWeb にログインし、
erp_databaseという名前のデータベースを作成します。詳細については、「データベースの作成」をご参照ください。
データベースにログインした後、以下の 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);
仮想ウェアハウスの作成
Hologres コンソールにログインし、ターゲットインスタンスの詳細ページに移動します。
左側のナビゲーションウィンドウで、計算グループ管理 をクリックし、仮想ウェアハウスリソース管理 タブに移動します。このタブでは、既存の仮想ウェアハウスのリストを表示できます。

「仮想ウェアハウスの新規追加」をクリックします。仮想ウェアハウスの追加ダイアログボックスで、「Virtual Warehouse Name」に入力し、「Virtual Warehouse Resource」を選択します。
このシナリオでは、
read_warehouse_1という名前の仮想ウェアハウスが作成されます:
OK をクリックして作成を完了します。
計算グループ管理 ページで、仮想ウェアハウスのステータスを確認します。Status 列の値が 現在実行中 の場合、仮想ウェアハウスは作成されています。

仮想ウェアハウスへのデータロード
テーブルグループは Hologres のデータコンテナです。デフォルトでは、新しい仮想ウェアハウスはどのテーブルグループにもアクセスできません。仮想ウェアハウスを使用してデータをクエリするには、まず仮想ウェアハウスに必要なテーブルグループへの権限を付与する必要があります。
現在のデータベース内のテーブルグループを表示します。
現在のデータベース内のテーブルグループを表示するには、以下の SQL ステートメントを実行します。
SELECT tablegroup_name FROM hologres.hg_table_group_properties GROUP BY tablegroup_name;以下にサンプル結果を示します。

これは、現在のデータベースにテーブルグループが 1 つしかないことを示しています。
仮想ウェアハウスにテーブルグループをロードします。
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);仮想ウェアハウスにロードされたテーブルグループを表示します。
SELECT * FROM hologres.hg_warehouse_table_groups;以下にサンプル結果を示します。

これは、read_warehouse_1 が erp_database_tg_default テーブルグループからデータをロードしたことを示しています。
ユーザー権限の設定
デフォルトでは、未承認ユーザーは新しい仮想ウェアハウスにアクセスできません。他のアカウントが仮想ウェアハウスにアクセスできるようにするには、それらのアカウントに権限を付与する必要があります。次の例では、ram_test リソースアクセス管理 (RAM) ユーザーに read_warehouse_1 仮想ウェアハウスへのアクセス権限を付与する方法を示します。
ユーザーの仮想ウェアハウス権限を表示します。
SELECT * FROM hologres.hg_warehouse_users;ユーザーのデフォルト仮想ウェアハウスに関する情報を表示します。
SELECT * FROM hologres.hg_user_default_warehouse;インスタンスへのユーザー追加。
HoloWeb の Users ページで、RAM ユーザーを Hologres インスタンスに追加します。詳細については、「ユーザー管理」をご参照ください。

ram_testユーザーにerp_databaseデータベースに対するクエリ権限を付与します。HoloWeb の [DB 権限付与] ページで、
ram_testユーザーにデータベースに対するクエリ権限を付与します。詳細については、「RAM ユーザーへの権限付与のクイックスタート」をご参照ください。
ram_testユーザーに [read_warehouse_1] 仮想ウェアハウスの権限を付与します。CALL hg_grant_warehouse_access_privilege ('read_warehouse_1', 'p4_2xxxxxxxxxxxxxxx');パラメーターの説明については、「仮想ウェアハウスを使用するためのユーザー承認」をご参照ください。
[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');現在のアカウントが使用している仮想ウェアハウスを表示します。
インスタンスに
ram_testユーザーとして接続した後、次のコマンドを実行して、read_warehouse_1 仮想ウェアハウスが使用されていることを確認します:SELECT current_warehouse();
仮想ウェアハウス間のトラフィック切り替え
新しい read_warehouse_1 仮想ウェアハウスを作成した後、エラーが発生している場合があります。このような場合は、ram_test アカウントのトラフィックを init_warehouse 仮想ウェアハウスに切り替える必要があります。

トラフィックの切り替えは、再接続後にのみ有効になります。Hologres に接続するアプリケーションに再接続メカニズムがあることを確認してください。
Hologres に接続するときは、その自動ルーティングロジックを使用してください。接続文字列に仮想ウェアハウス名を指定しないでください。
ram_testユーザーに init_warehouse 仮想ウェアハウスの権限を付与します。ram_testに init_warehouse の権限が付与されていない場合、次のコマンドを実行して、ram_testユーザーに init_warehouse 仮想ウェアハウスの権限を付与します。これにより、ram_testユーザーは init_warehouse のリソースを使用できるようになります。CALL hg_grant_warehouse_access_privilege('init_warehouse', 'p4_2xxxxxxxxxxxxxxx');init_warehouse 仮想ウェアハウスを
ram_testユーザーのデフォルトの仮想ウェアハウスとして設定します。次のコマンドを実行して、
ram_testユーザーのデフォルトの仮想ウェアハウスを [init_warehouse] に設定します。この設定後、ユーザーからインスタンスへの新しい接続は、[init_warehouse] 仮想ウェアハウスのリソースを使用します。CALL hg_set_user_default_warehouse('p4_2xxxxxxxxxxxxxxx', 'init_warehouse');デフォルト仮想ウェアハウスにないすべてのユーザー接続を切断します。
SELECT hg_kill_non_default_warehouse_connections();再接続後、新しいデフォルト仮想ウェアハウスがインスタンスへの接続に使用されます。