O Hologres V2.0 separa os recursos de computação em virtual warehouses independentes para implantações elásticas e de alta disponibilidade. Este guia aborda a criação de warehouses, o carregamento de dados, o acesso de usuários e a alternância de tráfego.
Informações básicas
As virtual warehouses oferecem isolamento de recursos, elasticidade, separação de leitura e escrita e isolamento de carga de trabalho. Arquitetura de virtual warehouse.
Pré-requisitos
Somente instâncias do Hologres V2.0.4 ou posteriores suportam virtual warehouses. Se sua instância executar uma versão anterior à V2.0.4, consulte Erros comuns durante a preparação da atualização ou entre no grupo DingTalk do Hologres para obter suporte. Para mais informações, consulte Como obtenho mais suporte online?.
Crie uma nova virtual warehouse
Este exemplo cria uma virtual warehouse chamada read_warehouse_1 para separação de leitura e escrita. A init_warehouse gerencia as escritas, enquanto a read_warehouse_1 processa as consultas.

Crie um banco de dados
-
Faça login no HoloWeb como superusuário e crie um banco de dados chamado
erp_database. Criar um banco de dados.
-
Conecte-se ao banco de dados e execute o SQL a seguir para importar dados de amostra.
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);
Crie uma virtual warehouse
Faça login no console do Hologres e acesse a página de detalhes da instância desejada.
-
No painel de navegação à esquerda, clique em Virtual Warehouse Management para abrir a aba Virtual Warehouse Resource Management.

-
Clique em Create Virtual Warehouse. Na caixa de diálogo, insira um Virtual Warehouse Name e selecione um Virtual Warehouse Resource.
Neste cenário, crie uma virtual warehouse chamada
read_warehouse_1.
Clique em OK.
-
Na página Virtual Warehouse Management, a criação da virtual warehouse é concluída com sucesso quando seu status na coluna Status for Running.

Carregar dados na virtual warehouse
Os grupos de tabelas são contêineres de dados no Hologres. Para consultar dados por meio de uma virtual warehouse, carregue primeiro os grupos de tabelas necessários nela.
-
Visualize os grupos de tabelas no banco de dados atual.
Execute a seguinte instrução SQL:
SELECT tablegroup_name FROM hologres.hg_table_group_properties GROUP BY tablegroup_name;Resultado de amostra:

O banco de dados possui um grupo de tabelas.
-
Carregue um grupo de tabelas para a virtual warehouse.
Carregue o erp_database_tg_default na read_warehouse_1 para permitir a consulta dos dados:
CALL hg_table_group_load_to_warehouse('erp_database.erp_database_tg_default', 'read_warehouse_1', 1); -
Verifique os grupos de tabelas carregados.
SELECT * FROM hologres.hg_warehouse_table_groups;Resultado de amostra:

A read_warehouse_1 agora tem o grupo de tabelas erp_database_tg_default carregado.
Defina permissões de usuário
Usuários não podem acessar uma nova virtual warehouse sem permissões explícitas. O exemplo a seguir concede ao usuário RAM ram_test acesso à read_warehouse_1.
-
Consulte as permissões de virtual warehouse de um usuário.
SELECT * FROM hologres.hg_warehouse_users; -
Verifique a virtual warehouse padrão de um usuário.
SELECT * FROM hologres.hg_user_default_warehouse; -
Adicione um usuário à instância.
Na página Users do HoloWeb, adicione o usuário RAM à instância do Hologres. Gerenciamento de usuários.

-
Conceda ao usuário
ram_testpermissões de consulta no banco de dadoserp_database.Na página Database authorization do HoloWeb, conceda permissões de consulta no banco de dados ao usuário
ram_test. Conceder permissões a um usuário RAM.
-
Conceda ao usuário
ram_testacesso à virtual warehouse read_warehouse_1.CALL hg_grant_warehouse_access_privilege ('read_warehouse_1', '"p4_2xxxxxxxxxxxxxxx"'); -
Defina a read_warehouse_1 como a virtual warehouse padrão para o usuário
ram_test.Para separação de leitura e escrita, o
ram_testdeve se conectar pela read_warehouse_1 em vez da init_warehouse. Defina a warehouse padrão para o usuárioram_test:CALL hg_set_user_default_warehouse('"p4_2xxxxxxxxxxxxxxx"', 'read_warehouse_1'); -
Verifique a virtual warehouse usada pela conta atual.
Após conectar-se como
ram_test, confirme a warehouse ativa:SELECT current_warehouse();
Alternar tráfego entre virtual warehouses
Se a read_warehouse_1 apresentar falhas, redirecione o tráfego do ram_test de volta para a init_warehouse.

As alterações de tráfego entram em vigor após a reconexão. Certifique-se de que sua aplicação possua um mecanismo de reconexão.
Utilize o roteamento automático ao conectar-se ao Hologres. Não especifique o nome de uma virtual warehouse na string de conexão.
-
Conceda ao usuário
ram_testacesso à virtual warehouse init_warehouse.Caso o
ram_testainda não tenha acesso à init_warehouse, conceda as permissões necessárias para que ele possa utilizar os recursos da init_warehouse:CALL hg_grant_warehouse_access_privilege('init_warehouse', '"p4_2xxxxxxxxxxxxxxx"'); -
Defina a init_warehouse como a virtual warehouse padrão para o usuário
ram_test.Configure a warehouse padrão do
ram_testpara init_warehouse. As novas conexões passarão a usar a init_warehouse.CALL hg_set_user_default_warehouse('"p4_2xxxxxxxxxxxxxxx"', 'init_warehouse'); -
Encerre as conexões que não estiverem usando a virtual warehouse padrão.
SELECT hg_kill_non_default_warehouse_connections(); Após a reconexão, a nova conexão utilizará a virtual warehouse padrão.