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.
O armazenamento orientado a colunas aplica-se exclusivamente ao tipo JSONB. Não o ative para colunas do tipo JSON.

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 ( |
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 |
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);
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.
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>';
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.

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);
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);
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 |
|
|
Nome da tabela |
|
|
Nome da coluna JSONB |
|
|
Cria um índice bitmap para a coluna. A coluna deve ter o armazenamento orientado a colunas ativado. |
|
|
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.
-
Crie a tabela.
DROP TABLE IF EXISTS user_tags; BEGIN; CREATE TABLE IF NOT EXISTS user_tags ( ds timestamptz, tags jsonb ); COMMIT; -
Ative o armazenamento orientado a colunas na coluna
tags.ALTER TABLE user_tags ALTER COLUMN tags SET (enable_columnar_type = ON); -
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
optionsparatagsexibe{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) -
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; -
(Opcional) Descarregue os dados no disco para visualizar o efeito do armazenamento orientado a colunas imediatamente.
VACUUM user_tags; -
Consulte os dados por uma chave específica.
SELECT (tags -> 'first_name')::text AS first_name FROM user_tags WHERE (tags -> 'id')::int = 10; -
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_usedna saída confirma o uso do armazenamento orientado a colunas.
-
Adicione um índice bitmap em
tagspara acelerar a consulta pontual da etapa 6.call set_table_property('user_tags', 'bitmap_columns', 'tags'); -
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_usedna saída confirma que o índice bitmap está ativo.
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.