Todos os produtos
Search
Central de documentação

Hologres:Blob Storage: Optimize storage for large values

Última atualização: Oct 21, 2026

O Hologres V5.0.0 e versões posteriores são compatíveis com o Blob Storage. Use a propriedade de tabela blob_columns para armazenar valores grandes em colunas TEXT e BYTEA de forma separada. Isso reduz a E/S de consultas pontuais e a sobrecarga de Compaction sem alterar o esquema da tabela ou a semântica das consultas. Este tópico descreve como o Blob Storage funciona, como utilizá-lo e seus limites.

Contexto

Nas tabelas orientadas a colunas do Hologres, valores muito grandes, como textos longos, conteúdo de documentos e campos de log extensos, causam os seguintes problemas:

  • Mais arquivos: Valores grandes ocupam tanto espaço que cada arquivo de dados armazena muito menos linhas, resultando em uma grande quantidade de arquivos pequenos.

  • Amplificação de E/S em consultas pontuais: Mesmo ao retornar apenas uma linha, uma consulta pontual ainda lê todos os valores grandes do bloco de dados correspondente.

  • Amplificação de escrita no Compaction: O Compaction lê, reescreve e move valores grandes repetidamente.

O Blob Storage armazena separadamente os valores acima de um determinado limiar de tamanho e mantém apenas uma referência a cada valor na coluna original. Isso melhora o armazenamento, a leitura e a compactação de valores grandes, sem alterar o esquema da tabela ou a semântica das consultas.

Casos de uso

O Blob Storage é ideal para cargas de trabalho com colunas de valores grandes, compostas principalmente por escritas e consultas pontuais, como:

  • Armazenar textos grandes ou conteúdo de documentos, como corpora de LLM e histórico de conversas.

  • Armazenar colunas de log muito extensas, como campos de log com dezenas de KB ou mais por linha.

  • Recuperar linhas inteiras, incluindo colunas de valores grandes, por chave primária ou filtro altamente seletivo.

Não ative o Blob Storage para cargas de trabalho OLAP com varreduras completas frequentes em colunas de valores grandes. Para obter mais informações, consulte Limits.

Como funciona

  • Armazenamento adaptativo por linha: Para cada coluna com o Blob Storage ativado, o sistema verifica o tamanho do valor linha por linha. O sistema compacta e armazena separadamente os valores que atingem o limiar, mantendo apenas uma referência na coluna original. Valores menores permanecem na coluna original. Uma única coluna pode conter linhas em ambos os formatos de armazenamento.

  • Leituras sob demanda: O sistema lê um valor grande apenas quando a consulta realmente o retorna. O sistema nunca aciona a leitura de valores grandes armazenados separadamente para linhas filtradas pela cláusula WHERE ou colunas não referenciadas pela consulta.

  • Nenhuma reescrita durante o Compaction: Por padrão, o Compaction move apenas as referências ao mesclar arquivos e não lê nem reescreve os valores grandes armazenados separadamente. O sistema reorganiza os valores grandes apenas ao recuperar dados excluídos ou quando a proporção de dados inválidos ou a fragmentação de arquivos se torna muito alta.

Recurso complementar: Blob Column Lazy Seek

Para consultas pontuais altamente seletivas, como WHERE k = x, o Lazy Seek aguarda a filtragem identificar as linhas correspondentes e, em seguida, lê apenas os valores grandes dessas linhas. Ele não lê nem descompacta todos os valores grandes no grupo de linhas.

  • Parâmetro: Controlado pelo parâmetro GUC (Grand Unified Configuration) hg_experimental_enable_blob_column_lazy_seek. Valor padrão: on.

  • Condições: O Lazy Seek entra em vigor apenas quando exatamente uma linha em um grupo de linhas corresponde ao filtro e a coluna do Blob Storage é uma coluna de saída direta. Caso contrário, o sistema volta a ler a coluna inteira. Isso não afeta os resultados da consulta.

Benefícios

  • E/S de consulta pontual muito menor: Uma consulta pontual lê apenas os valores grandes das linhas correspondentes, em vez de todos os valores grandes no grupo de linhas. Com o Lazy Seek, a quantidade de dados lidos e descompactados cai significativamente.

  • Amplificação de escrita do Compaction muito menor: Por padrão, o Compaction move apenas referências e não reescreve valores grandes, o que acelera significativamente a sua conclusão.

  • Menos arquivos: Com os valores grandes armazenados separadamente, os arquivos de dados são menores e cada arquivo armazena mais linhas, resultando na criação de menos arquivos pequenos.

  • Transparência para aplicações: É possível ativar o Blob Storage diretamente em colunas TEXT e BYTEA existentes. Nenhuma alteração especial no tipo de coluna ou no SQL é necessária.

Nota

O Blob Storage não foi projetado para reduzir o armazenamento total. Valores grandes armazenados separadamente ainda consomem armazenamento. Quando medidas por pg_relation_size, as tabelas com e sem Blob Storage usam aproximadamente a mesma quantidade de armazenamento após a execução do Full Compaction em ambas as tabelas. Os benefícios do Blob Storage são a menor E/S em consultas pontuais, um Compaction mais eficiente e menos arquivos, e não a economia de armazenamento.

Limites

  • O Blob Storage é compatível apenas com o Hologres V5.0.0 e versões posteriores.

  • Há suporte apenas para colunas TEXT e BYTEA. O Blob Storage está disponível para tabelas orientadas a colunas e tabelas híbridas de linhas e colunas, mas não para tabelas orientadas a linhas.

  • Colunas com o Blob Storage ativado não suportam codificação de dicionário ou índices de bitmap. Se definir dictionary_encoding_columns ou bitmap_columns para essa coluna, o sistema ignorará a configuração e a tratará como desativada. Outros índices, incluindo índices invertidos de texto completo, funcionam normalmente. Evite ativar o Blob Storage em colunas de baixa cardinalidade filtradas por igualdade. Sem o índice de bitmap, os filtros de igualdade recorrem a varreduras completas na tabela e precisam ler os valores grandes armazenados separadamente, tornando as consultas significativamente mais lentas.

  • Consultas OLAP com varredura completa em colunas de valores grandes ficam mais lentas: Uma varredura completa precisa ler e descompactar cada valor grande individualmente, o que é mais lento em comparação ao uso sem o Blob Storage. Se sua carga de trabalho executa varreduras completas frequentes em colunas de valores grandes, avalie o impacto antes de ativar o Blob Storage.

  • O uso de armazenamento depende dos seus dados e não necessariamente diminui: Para valores pequenos e altamente repetitivos (baixa cardinalidade), o uso de armazenamento pode aumentar. Para valores grandes com pouca repetição, o uso de armazenamento pode diminuir. Execute o Full Compaction antes de comparar o uso de armazenamento.

  • Tabelas particionadas: As partições filhas herdam blob_columns da tabela pai. O comando ATTACH PARTITION falha a menos que a tabela pai e a tabela filha tenham a mesma configuração de blob_columns.

  • Em uma coluna que armazena dados binários brutos com exatamente 32 bytes de comprimento, há uma chance muito pequena de o sistema identificar incorretamente um valor como uma referência de valor grande. Se precisar armazenar esses dados, desative o Blob Storage para essa coluna.

Ativar o Blob Storage

Chame set_table_property para definir a propriedade de tabela blob_columns e especificar as colunas que usam o Blob Storage. Sintaxe:

CALL set_table_property('<TABLE_NAME>', 'blob_columns', '<COLUMN_NAME>:{on|auto|off}[,...]');

A tabela a seguir descreve os parâmetros.

Parâmetro

Descrição

TABLE_NAME

O nome da tabela.

COLUMN_NAME

O nome da coluna. Há suporte apenas para colunas TEXT e BYTEA. Separe várias colunas com vírgulas (,), por exemplo, 'col1:on,col2:auto'.

O valor padrão de blob_columns é uma string vazia (''). Colunas não configuradas sempre armazenam valores na coluna original.

on

Força a ativação do Blob Storage para a coluna. O sistema armazena valores grandes separadamente.

auto

O sistema decide, com base no limiar de tamanho, se deve armazenar cada valor separadamente.

off

Desativa o Blob Storage para a coluna.

É possível alterar blob_columns a qualquer momento. A alteração não reescreve os arquivos existentes imediatamente. Assim como bitmap_columns e dictionary_encoding_columns, ela entra em vigor gradualmente durante a execução do Compaction em segundo plano.

-- Force Blob Storage on for the payload column
CALL set_table_property('<TABLE_NAME>', 'blob_columns', 'payload:on');
-- Let the system decide based on the size threshold
CALL set_table_property('<TABLE_NAME>', 'blob_columns', 'payload:auto');

Verificar se o Blob Storage entrou em vigor

  1. Verifique a configuração: Execute a seguinte instrução para visualizar o DDL da tabela. Se a saída contiver a propriedade blob_columns, a configuração está ativa.

    SELECT hg_dump_script('<TABLE_NAME>');
  2. Compare a E/S de consultas pontuais: Ative as estatísticas de execução e limpe o cache. Em seguida, execute EXPLAIN ANALYZE na mesma consulta pontual altamente seletiva e compare decompress_out_bytes e total_read_bytes em se_read_statistic.

    SET hg_experimental_show_execution_statistics_in_explain = on;
    SELECT hg_admin_command('freecache', 'table_name=<TABLE_NAME>');
    EXPLAIN ANALYZE SELECT id, payload FROM <TABLE_NAME> WHERE k = 5000;

    Com o Blob Storage ativado e o Lazy Seek definido como on, uma consulta pontual que corresponde a uma única linha descompacta apenas os dados dessa linha. Com o Lazy Seek desativado ou sem o Blob Storage, a consulta descompacta o grupo de linhas inteiro.

  3. Verifique o uso de armazenamento: Execute primeiro o Full Compaction e, em seguida, consulte o uso de armazenamento com pg_relation_size ou hologres.hg_relation_size. Sem o Full Compaction, arquivos de fragmentos não mesclados distorcem a comparação.

    SELECT hologres.hg_full_compact_table('<SCHEMA_NAME>.<TABLE_NAME>');
    SELECT pg_relation_size('<TABLE_NAME>');
    -- Alternatively
    SELECT hologres.hg_relation_size('<SCHEMA_NAME>.<TABLE_NAME>', 'data');

Compatibilidade de upgrade e downgrade

  • Upgrade: Compatível. A atualização de uma instância para o Hologres V5.0.0 ou posterior não causa impacto.

  • Downgrade: Não suportado. O sistema não permite o downgrade de tabelas com o Blob Storage ativado para uma versão anterior ao Hologres V5.0.0. Versões anteriores não reconhecem valores grandes armazenados separadamente e retornam as referências na coluna original como valores regulares, o que produz dados incorretos.

  • Antes de fazer o downgrade: Remova todos os valores grandes armazenados separadamente usando um dos seguintes métodos:

    • Exclua as tabelas que têm o Blob Storage ativado.

    • Defina as colunas relevantes em blob_columns como off, execute VACUUM ou hologres.hg_full_compact_table na tabela e aguarde a conclusão do Compaction. Em seguida, execute a seguinte instrução para confirmar que não restam valores grandes armazenados separadamente. Se retornar f (falso), faça o downgrade com segurança.

      SELECT EXISTS (
          SELECT 1 FROM <TABLE_NAME>
          WHERE hg_file_meta IS NOT NULL
            AND COALESCE((hg_file_meta ->> 'blob_file_count')::bigint, 0) > 0
      ) AS has_blob_file;

Exemplo

O exemplo a seguir cria uma tabela orientada a colunas chamada docs, força a ativação do Blob Storage para a coluna de valores grandes payload e, em seguida, executa uma consulta pontual e verifica o uso de armazenamento.

-- Create a table and force Blob Storage on for the large-value column payload
BEGIN;
CREATE TABLE docs (
    id INT PRIMARY KEY,
    k INT,
    payload TEXT
)
WITH (orientation = 'column');
CALL set_table_property('docs', 'clustering_key', 'k:asc');
CALL set_table_property('docs', 'blob_columns', 'payload:on');
COMMIT;

-- Write large values and flush them to disk
INSERT INTO docs SELECT g, g, repeat(md5(g::text), 3200) FROM generate_series(1, 10000) g;
SELECT hg_admin_command('flush', 'table_name=docs');

-- Highly selective point query: matches a single row, and Lazy Seek reads only that row's large value
SELECT id, payload FROM docs WHERE k = 5000;

-- Check storage usage (always run Full Compaction before you compare)
SELECT hologres.hg_full_compact_table('public.docs');
SELECT pg_size_pretty(pg_relation_size('docs'));