Todos os produtos
Search
Central de documentação

Hologres:Quickstart: Use virtual warehouses

Última atualização: Jul 29, 2026

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 gerais

Os virtual warehouses oferecem isolamento de recursos, elasticidade, separação de leitura/escrita e isolamento de cargas de trabalho. Virtual warehouse architecture.

Pré-requisitos

Somente instâncias Hologres na versão V2.0.4 ou posterior oferecem suporte a virtual warehouses. Se sua instância estiver em uma versão anterior à V2.0.4, consulte Common errors during upgrade preparation ou entre no grupo DingTalk do Hologres para obter suporte. Para mais informações, consulte How do I get more online support?.

Criar um novo virtual warehouse

Este exemplo cria um virtual warehouse chamado read_warehouse_1 para separação de leitura/escrita. O init_warehouse é responsável pelas gravações, enquanto o read_warehouse_1 cuida das consultas.

image..png

Criar um banco de dados

  1. Faça login no HoloWeb como superusuário e crie um banco de dados chamado erp_database. Create a database.

    Na caixa de diálogo Create Database, configure os seguintes parâmetros:

    • Instance: Selecione a instância de destino.

    • Database Name: Insira um nome para o banco de dados, por exemplo, erp_database.

    • Permission Policy: Selecione SPM.

    • Log On Immediately: Selecione Yes. Ao fazer login em um banco de dados, todas as páginas abertas no banco de dados atual são fechadas. Salve seu trabalho antes de continuar.

    Clique em OK para concluir a criação.

  2. Conecte-se ao banco de dados e execute o seguinte SQL 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);

Criar um virtual warehouse

  1. Faça login no console do Hologres e acesse a página de detalhes da instância de destino.

  2. No painel de navegação à esquerda, clique em Virtual Warehouse Management para abrir a aba Virtual Warehouse Resource Management.

    A página exibe a alocação de recursos reservados e elásticos da instância, além de um botão Add Virtual Warehouse para criar um virtual warehouse.

  3. 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 um virtual warehouse chamado read_warehouse_1.

    Neste cenário, selecione 32 CU (32 Core 128 GB, nós: 2) em Virtual Warehouse Resources e clique em OK para concluir a criação.

  4. Clique em OK.

  5. Na página Virtual Warehouse Management, o virtual warehouse foi criado com sucesso quando o status exibido na coluna Status for Running.

Carregar dados no virtual warehouse

Table groups são contêineres de dados no Hologres. Para consultar dados por meio de um virtual warehouse, carregue primeiro os table groups necessários nele.

  1. Visualize os table groups 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 exemplo: o resultado da consulta mostra que o nome do Table Group é erp_database_tg_default.

    O banco de dados possui um table group.

  2. Carregue um table group no virtual warehouse.

    Carregue erp_database_tg_default em read_warehouse_1 para que ele possa consultar os dados:

    CALL hg_table_group_load_to_warehouse('erp_database.erp_database_tg_default', 'read_warehouse_1', 1);
  3. Verifique os table groups carregados.

    SELECT * FROM hologres.hg_warehouse_table_groups;

    Resultado de exemplo:image..png

    O read_warehouse_1 agora tem o table group erp_database_tg_default carregado.

Definir permissões de usuário

Novos usuários não têm acesso a um virtual warehouse sem permissões explícitas. O exemplo a seguir concede a um usuário RAM chamado ram_test acesso ao read_warehouse_1.

  1. Visualize as permissões de virtual warehouse de um usuário.

    SELECT * FROM hologres.hg_warehouse_users;
  2. Consulte o virtual warehouse padrão de um usuário.

    SELECT * FROM hologres.hg_user_default_warehouse;
  3. Adicione um usuário à instância.

    Na página Users do HoloWeb, adicione o usuário RAM à instância Hologres. User management.

    O usuário RAM adicionado aparece na lista User Account, com o tipo de função padrão definido como Normal. Ajuste as permissões pela opção Modify Role Type na coluna de ações.

  4. Conceda ao usuário ram_test permissões de consulta no banco de dados erp_database.

    Na página Database authorization do HoloWeb, conceda ao usuário ram_test permissões de consulta no banco de dados. Grant permissions to a RAM user.

  5. Conceda ao usuário ram_test acesso ao virtual warehouse read_warehouse_1.

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

    Authorize users to use a virtual warehouse.

  6. Defina read_warehouse_1 como o virtual warehouse padrão para o usuário ram_test.

    Para a separação de leitura/escrita, o ram_test deve se conectar por meio do read_warehouse_1 em vez do init_warehouse. Defina o warehouse padrão para o usuário ram_test:

    CALL hg_set_user_default_warehouse('"p4_2xxxxxxxxxxxxxxx"', 'read_warehouse_1');
  7. Verifique o virtual warehouse usado pela conta atual.

    Após conectar como ram_test, confirme o warehouse ativo:

    SELECT current_warehouse();

Alternar tráfego entre virtual warehouses

Se o read_warehouse_1 apresentar falha, redirecione o tráfego do ram_test de volta para o init_warehouse.

image..png

Importante
  • As alternâncias de tráfego entram em vigor na reconexão. Certifique-se de que sua aplicação possui um mecanismo de reconexão.

  • Use o roteamento automático ao conectar-se ao Hologres. Não especifique um nome de virtual warehouse na string de conexão.

  1. Conceda ao usuário ram_test acesso ao virtual warehouse init_warehouse.

    Caso o ram_test ainda não tenha acesso ao init_warehouse, conceda permissões ao ram_test para que possa usar os recursos do init_warehouse:

    CALL hg_grant_warehouse_access_privilege('init_warehouse', '"p4_2xxxxxxxxxxxxxxx"');
  2. Defina init_warehouse como o virtual warehouse padrão para o usuário ram_test.

    Atribua o init_warehouse como warehouse padrão do ram_test. Novas conexões passarão a usar o init_warehouse.

    CALL hg_set_user_default_warehouse('"p4_2xxxxxxxxxxxxxxx"', 'init_warehouse');
  3. Encerre as conexões que não estão usando o virtual warehouse padrão.

    SELECT hg_kill_non_default_warehouse_connections(); 
  4. Após reconectar, a nova conexão usará o virtual warehouse padrão.