Todos os produtos
Search
Central de documentação

Hologres:Acelerar consultas JSONB

Última atualização: Jun 28, 2026

O armazenamento orientado a colunas para JSONB permite que o Hologres armazene e compacte dados semiestruturados com a mesma eficiência dos dados estruturados, o que reduz os custos de armazenamento e acelera significativamente as consultas no nível de campo. O Hologres V1.3 e versões posteriores oferecem suporte a esse recurso para tabelas orientadas a colunas.

Como funciona

Ao ativar o armazenamento orientado a colunas em uma coluna JSONB, o Hologres converte essa coluna em várias subcolunas fortemente tipadas na camada de armazenamento, sendo uma para cada chave JSON. As consultas direcionadas a uma chave específica varrem apenas essa subcoluna, em vez de desserializar todo o valor JSONB. Isso proporciona o mesmo ganho de eficiência obtido com o armazenamento colunar em dados estruturados.

Nota

O armazenamento orientado a colunas aplica-se exclusivamente ao tipo JSONB. Não o ative para colunas do tipo JSON.

image

Pré-requisitos

Antes de começar, certifique-se de que:

  • Sua instância do Hologres seja da versão V1.3 ou posterior. Para obter o melhor desempenho, atualize para a V1.3.37 ou superior. Para atualizar manualmente, consulte Atualizações de instância. Para solicitar uma atualização por meio da equipe de suporte, consulte Obter suporte online para o Hologres.

  • A coluna de destino esteja em uma tabela orientada a colunas. O armazenamento orientado a colunas para JSONB não é compatível com tabelas orientadas a linhas.

  • A tabela contenha pelo menos 1.000 linhas. O armazenamento orientado a colunas é acionado somente após atingir esse limiar.

Quando o armazenamento orientado a colunas apresenta baixo desempenho

Em alguns cenários, o armazenamento orientado a colunas não melhora o desempenho e pode até prejudicá-lo:

Cenário

Motivo do baixo desempenho

Alternativa recomendada

Consultas que retornam toda a coluna JSONB (SELECT json_data FROM tbl)

O Hologres precisa reconstruir o valor JSONB original a partir das subcolunas, gerando alta E/S

Mantenha o modo de armazenamento padrão para colunas consultadas integralmente

Dados extremamente esparsos (cada chave aparece apenas uma vez nas linhas)

Todos os campos esparsos são direcionados para uma coluna interna holo.remaining, sem criação de subcolunas

Transforme os campos esparsos em colunas relacionais dedicadas

JSONB cujo nó raiz é um array contendo estruturas diferentes

Estruturas mistas não podem ser divididas em subcolunas consistentes

Normalize a estrutura dos dados antes da ingestão ou armazene como JSONB padrão

Somente os operadores -> e ->> acionam o acesso orientado a colunas. Consultas que utilizam outros operadores recorrem a varreduras completas do JSONB, o que pode ser mais lento do que no modo de armazenamento original.

Operador

Operando direito

Descrição

->

TEXT

Obtém um campo de objeto JSON com base em uma chave

->>

TEXT

Retorna um campo de objeto JSON como TEXT

Ativar o armazenamento orientado a colunas

Ativar para uma coluna JSONB

-- Enable column-oriented storage for a JSONB column.
ALTER TABLE <table_name> ALTER COLUMN <column_name> SET (enable_columnar_type = ON);
Importante

Após executar essa instrução, o Hologres converte todos os dados existentes na coluna para o armazenamento orientado a colunas durante a próxima compactação. A compactação consome memória, portanto execute-a fora do horário de pico. Os novos dados gravados são armazenados no modo orientado a colunas imediatamente após a conclusão da compactação.

VACUUM <table_name>;

Ativar inferência de tipo DECIMAL (V2.0.11+)

O Hologres V2.0.11 e versões posteriores oferecem suporte ao armazenamento orientado a colunas para dados do tipo DECIMAL. Ao ativar a inferência de tipo DECIMAL para um campo numérico, como balance em {"balance": 123.45}, o armazenamento orientado a colunas passa a ser compatível com esses dados.

Importante

Ative o armazenamento orientado a colunas na coluna antes de habilitar a inferência de tipo DECIMAL.

-- Enable DECIMAL type inference for a JSONB column.
ALTER TABLE <table_name> ALTER COLUMN <column_name> SET (enable_decimal = ON);

Verificar o modo de armazenamento

Hologres V1.3.37 e posterior

SELECT * FROM hologres.hg_column_options
WHERE schema_name = '<schema_name>' AND table_name = '<table_name>';
Nota

Na V2.0.17 e anteriores, essa consulta funciona apenas para tabelas no schema public. A partir da V2.0.18, ela funciona para todos os schemas.

Uma coluna que apresenta {enable_columnar_type=on} no campo options está com o armazenamento orientado a colunas ativado.

image

Hologres V1.3.10 a V1.3.36

SELECT DISTINCT
    a.attnum as num,
    a.attname as name,
    format_type(a.atttypid, a.atttypmod) as type,
    a.attnotnull as notnull,
    com.description as comment,
    coalesce(i.indisprimary,false) as primary_key,
    def.adsrc as default,
    a.attoptions
FROM pg_attribute a
JOIN pg_class pgc ON pgc.oid = a.attrelid
LEFT JOIN pg_index i ON
    (pgc.oid = i.indrelid AND i.indkey[0] = a.attnum)
LEFT JOIN pg_description com ON
    (pgc.oid = com.objoid AND a.attnum = com.objsubid)
LEFT JOIN pg_attrdef def ON
    (a.attrelid = def.adrelid AND a.attnum = def.adnum)
WHERE a.attnum > 0 AND pgc.oid = a.attrelid
    AND pg_table_is_visible(pgc.oid)
    AND NOT a.attisdropped
    AND pgc.relname = '<table_name>'
ORDER BY a.attnum;

Verifique o campo attoptions. O valor enable_columnar_type = ON confirma que o armazenamento orientado a colunas está ativo.

Desativar o armazenamento orientado a colunas

Desativar para uma coluna JSONB

-- Disable column-oriented storage for a JSONB column.
ALTER TABLE <table_name> ALTER COLUMN <column_name> SET (enable_columnar_type = OFF);
Importante

Após executar essa instrução, o Hologres converte todos os dados de volta para o armazenamento JSONB padrão durante a próxima compactação. Execute a compactação fora do horário de pico utilizando VACUUM <table_name>;.

Desativar a inferência de tipo DECIMAL

-- Disable DECIMAL type inference for a JSONB column.
ALTER TABLE <table_name> ALTER COLUMN <column_name> SET (enable_decimal = OFF);
Nota

Desativar a inferência de tipo DECIMAL aciona a compactação imediatamente para converter as subcolunas DECIMAL de volta ao formato original.

Adicionar índices bitmap para consultas pontuais (V2.0+)

Depois que o armazenamento orientado a colunas converte as chaves JSONB em subcolunas tipadas, é possível adicionar índices bitmap nessas subcolunas para acelerar consultas pontuais (comparações de igualdade). Os índices bitmap são mais eficazes quando a chave aparece frequentemente nas linhas e a consulta busca um valor exato.

Com o armazenamento orientado a colunas ativado, o Hologres analisa os seguintes tipos: INT, INT[], BIGINT, BIGINT[], TEXT, TEXT[] e JSONB. Índices bitmap são criados para subcolunas dos tipos INT, INT[], BIGINT, BIGINT[], TEXT e TEXT[].

call set_table_property('<table_name>', 'bitmap_columns', '[<columnName>{:[on|off]}[,...]]');

Parâmetro

Descrição

table_name

Nome da tabela

columnName

Nome da coluna JSONB

on

Cria um índice bitmap para a coluna. A coluna deve ter o armazenamento orientado a colunas ativado.

off

Remove o índice bitmap da coluna

Exemplo

O exemplo a seguir demonstra como ativar o armazenamento orientado a colunas, importar dados, realizar consultas e verificar o plano de execução.

  1. Crie a tabela.

    DROP TABLE IF EXISTS user_tags;
    
    BEGIN;
    CREATE TABLE IF NOT EXISTS user_tags (
        ds   timestamptz,
        tags jsonb
    );
    COMMIT;
  2. Ative o armazenamento orientado a colunas na coluna tags.

    ALTER TABLE user_tags ALTER COLUMN tags SET (enable_columnar_type = ON);
  3. Verifique se o armazenamento orientado a colunas está ativado.

    SELECT * FROM hologres.hg_column_options WHERE table_name = 'user_tags';

    Saída esperada — o campo options para tags exibe {enable_columnar_type=on}:

     schema_name | table_name | column_id | column_name |       column_type        | notnull | comment | default |          options
    -------------+------------+-----------+-------------+--------------------------+---------+---------+---------+---------------------------
     public      | user_tags  |         1 | ds          | timestamp with time zone | f       |         |         |
     public      | user_tags  |         2 | tags        | jsonb                    | f       |         |         | {enable_columnar_type=on}
    (2 rows)
  4. Importe os dados.

    INSERT INTO user_tags (ds, tags)
    SELECT
        '2022-01-01 00:00:00+08',
        ('{"id":' || i || ',"first_name":"Sig","gender":"Male"}')::jsonb
    FROM generate_series(1, 10001) i;
  5. (Opcional) Descarregue os dados no disco para visualizar o efeito do armazenamento orientado a colunas imediatamente.

    VACUUM user_tags;
  6. Consulte os dados por uma chave específica.

    SELECT (tags -> 'first_name')::text AS first_name
    FROM user_tags
    WHERE (tags -> 'id')::int = 10;
  7. Confirme se o armazenamento orientado a colunas está ativo verificando o plano de execução.

    -- Enable detailed execution statistics.
    SET hg_experimental_show_execution_statistics_in_explain = ON;
    
    EXPLAIN ANALYZE
    SELECT (tags -> 'first_name')::text AS first_name
    FROM user_tags
    WHERE (tags -> 'id')::int = 10;

    A presença de columnar_access_used na saída confirma o uso do armazenamento orientado a colunas.

    image

  8. Adicione um índice bitmap em tags para acelerar a consulta pontual da etapa 6.

    call set_table_property('user_tags', 'bitmap_columns', 'tags');
  9. Verifique se o índice bitmap está sendo utilizado.

    EXPLAIN ANALYZE
    SELECT (tags -> 'first_name')::text AS first_name
    FROM user_tags
    WHERE (tags -> 'id')::int = 10;

    O termo bitmap_used na saída confirma que o índice bitmap está ativo.

    image..png

Práticas recomendadas

Escrever consultas com operadores suportados

O armazenamento orientado a colunas só se aplica quando as consultas usam -> ou ->>. Para conversão de texto, ->> é mais rápido do que fazer cast com ->:

-- Faster: uses ->> directly
SELECT json_data->>'name' FROM tbl;

-- Slower: converts JSONB field to text via cast
SELECT (json_data->'name')::text FROM tbl;

Para verificar se um campo de array TEXT contém um valor específico, utilize jsonb_to_textarray:

SELECT key FROM tbl WHERE jsonb_to_textarray(json_data->'phones') && ARRAY['123456'];

Diagnosticar consultas lentas após ativar o armazenamento orientado a colunas

Se o desempenho das consultas cair após a ativação do armazenamento orientado a colunas, verifique se a consulta está varrendo todo o valor JSONB:

CREATE TABLE tbl (key int, json_data json);
ALTER TABLE tbl ALTER COLUMN json_data SET (enable_columnar_type = on);

EXPLAIN ANALYZE SELECT json_data FROM tbl WHERE key = 123;

Caso a saída do plano de execução contenha o aviso abaixo, significa que a consulta retorna a coluna JSONB completa e o armazenamento orientado a colunas está gerando sobrecarga:

Column 'json_data' has enabled columnar jsonb, but the query scanned the entire Jsonb value

Desative o armazenamento orientado a colunas para essa coluna ou reescreva a consulta para selecionar apenas as chaves específicas necessárias.

Executar a compactação fora do horário de pico

Tanto a ativação quanto a desativação do armazenamento orientado a colunas exigem compactação para converter os dados existentes. Como a compactação consome memória, para acioná-la manualmente, execute:

VACUUM <table_name>;

Perguntas frequentes

Por que o uso de armazenamento aumentou após eu ativar o armazenamento orientado a colunas?

Geralmente, o armazenamento orientado a colunas reduz o espaço utilizado ao eliminar nomes de chaves e compactar valores por tipo. No entanto, se os dados JSONB forem esparsos, o número de subcolunas cresce significativamente, e cada coluna adiciona sobrecarga para coleta de estatísticas e criação de índices. Se a maioria dos tipos das subcolunas for TEXT, os ganhos de compactação serão limitados. A redução do armazenamento depende da dispersão e da distribuição de tipos dos seus dados.