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.
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_columnsoubitmap_columnspara 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_columnsda tabela pai. O comandoATTACH PARTITIONfalha a menos que a tabela pai e a tabela filha tenham a mesma configuração deblob_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, O valor padrão de |
|
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
-
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>'); -
Compare a E/S de consultas pontuais: Ative as estatísticas de execução e limpe o cache. Em seguida, execute
EXPLAIN ANALYZEna mesma consulta pontual altamente seletiva e comparedecompress_out_bytesetotal_read_bytesemse_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. -
Verifique o uso de armazenamento: Execute primeiro o Full Compaction e, em seguida, consulte o uso de armazenamento com
pg_relation_sizeouhologres.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_columnscomooff, executeVACUUMouhologres.hg_full_compact_tablena 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 retornarf(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'));