SELECT apenas uma vez e atender às execuções subsequentes da mesma consulta diretamente do cache.
Dependendo do tipo de consulta, isso pode reduzir drasticamente a latência e o consumo de recursos do servidor ClickHouse.
Contexto, design e limitações
- Em caches transacionalmente consistentes, o banco de dados invalida (descarta) os resultados de consultas em cache se o resultado da consulta
SELECTmudar ou puder mudar. No ClickHouse, as operações que alteram os dados incluem inserções/atualizações/exclusões em/de tabelas oumergesde colapsamento. O cache transacionalmente consistente é especialmente adequado para bancos de dados OLTP, como MySQL (que removeu o cache de consultas após a v8.0) e Oracle. - Em caches transacionalmente inconsistentes, pequenas imprecisões nos resultados das consultas são aceitas, partindo do pressuposto de que todas as entradas de cache recebem
um período de validade após o qual expiram (por exemplo, 1 minuto) e de que os dados subjacentes mudam pouco durante esse período.
Essa abordagem é, em geral, mais adequada para bancos de dados OLAP. Como exemplo de caso em que o cache transacionalmente inconsistente é suficiente,
considere um relatório de vendas por hora em uma ferramenta de relatórios acessado simultaneamente por vários usuários. Em geral, os dados de vendas mudam
devagar o suficiente para que o banco de dados precise computar o relatório apenas uma vez (representado pela primeira consulta
SELECT). As consultas seguintes podem ser atendidas diretamente pelo cache de consultas. Neste exemplo, um período de validade razoável poderia ser de 30 min.
Configurações e uso
No ClickHouse Cloud, você deve usar configurações em nível de consulta para editar as configurações do cache de consultas. No momento, não há suporte para editar configurações em nível de configuração.
O clickhouse-local executa uma única consulta por vez. Como o cache de resultados de consultas não faz sentido, o
cache de resultados de consultas fica desativado no clickhouse-local.
use_query_cache = true) irão
ler do cache o resultado já calculado e retorná-lo imediatamente.
Definir
use_query_cache e todas as outras configurações relacionadas ao cache de consultas só tem efeito em instruções SELECT independentes. Em particular,
os resultados de SELECTs em views criadas por CREATE VIEW AS SELECT [...] SETTINGS use_query_cache = true não são armazenados em cache, a menos que a instrução SELECT
seja executada com SETTINGS use_query_cache = true.true por padrão). A primeira configuração
controla se os resultados das consultas são armazenados no cache, enquanto a segunda determina se o banco de dados deve tentar recuperar do cache os resultados das consultas.
Por exemplo, a consulta a seguir usará o cache apenas de forma passiva, ou seja, tentará ler dele, mas não armazenará nele o seu
resultado:
use_query_cache, enable_writes_to_query_cache e
enable_reads_from_query_cache apenas em consultas específicas. Também é possível habilitar o cache no nível do usuário ou do perfil (por exemplo, via SET use_query_cache = true), mas é preciso ter em mente que todas as consultas SELECT podem, nesse caso, retornar resultados em cache.
O cache de consultas pode ser limpo usando a instrução SYSTEM CLEAR QUERY CACHE. O conteúdo do cache de consultas é exibido na tabela de sistema
system.query_cache. O número de acertos e falhas do cache de consultas desde a inicialização do banco de dados é mostrado como eventos
“QueryCacheHits” e “QueryCacheMisses” na tabela de sistema system.events. Ambos os contadores são atualizados apenas para
consultas SELECT executadas com a configuração use_query_cache = true; outras consultas não afetam “QueryCacheMisses”. O campo query_cache_usage
na tabela de sistema system.query_log mostra, para cada consulta executada, se o resultado da consulta foi gravado no
cache de consultas ou lido dele. As métricas QueryCacheEntries e QueryCacheBytes na tabela de sistema
system.metrics mostram quantas entradas / bytes o cache de consultas contém no momento.
O cache de consultas existe uma vez por processo do servidor ClickHouse. No entanto, por padrão, os resultados em cache não são compartilhados entre usuários. Isso pode ser
alterado (veja abaixo), mas não é recomendado por motivos de segurança.
Os resultados das consultas são referenciados no cache de consultas pela Abstract Syntax Tree (AST) de
cada consulta. Isso significa que o cache não diferencia maiúsculas de minúsculas; por exemplo, SELECT 1 e select 1 são tratados como a mesma consulta. Para
tornar a correspondência mais natural, todas as configurações no nível da consulta relacionadas ao cache de consultas e à formatação de saída)
são removidas da AST.
Se a consulta foi interrompida devido a uma exceção ou a um cancelamento pelo usuário, nenhuma entrada é gravada no cache de consultas.
O tamanho do cache de consultas em bytes, o número máximo de entradas de cache e o tamanho máximo de entradas individuais de cache (em bytes e em
registros) podem ser configurados usando diferentes opções de configuração do servidor.
users.xml e, em seguida, torne ambas as configurações
somente leitura:
Age e Expires com a idade (em segundos) e o timestamp de expiração da
entrada em cache.
As entradas no cache de consultas são comprimidas por padrão. Isso reduz o consumo geral de memória, ao custo de gravações mais lentas no cache e leituras mais lentas
a partir do cache de consultas. Para desabilitar a compressão, use a configuração query_cache_compress_entries.
Às vezes, é útil manter em cache vários resultados da mesma consulta. Isso pode ser obtido usando a configuração
query_cache_tag, que atua como um rótulo (ou espaço de nomes) para entradas do cache de consultas. O cache de consultas
considera como diferentes os resultados da mesma consulta com tags diferentes.
Exemplo de como criar três entradas diferentes no cache de consultas para a mesma consulta:
tag do cache de consultas, você pode usar a instrução SYSTEM CLEAR QUERY CACHE TAG 'tag'.
O ClickHouse lê os dados da tabela em blocos de max_block_size linhas. Devido à filtragem, agregação,
etc., os blocos de resultado normalmente são muito menores que ‘max_block_size’, mas também há casos em que são bem maiores. A configuração
query_cache_squash_partial_results (habilitada por padrão) controla se os blocos de resultado
são combinados (se forem muito pequenos) ou divididos (se forem grandes) em blocos do tamanho de ‘max_block_size’ antes de serem inseridos no cache de resultados da consulta.
Isso reduz o desempenho das gravações no cache de consultas, mas melhora a taxa de compressão das entradas de cache e proporciona uma
granularidade de bloco mais natural quando os resultados da consulta são posteriormente servidos a partir do cache de consultas.
Como resultado, o cache de consultas armazena, para cada consulta, vários blocos de
resultado (parciais). Embora esse comportamento seja um bom padrão, ele pode ser suprimido usando a configuração
query_cache_squash_partial_results.
Além disso, os resultados de consultas com funções não determinísticas não são armazenados em cache por padrão. Essas funções incluem
- funções para acessar dicionários:
dictGet()etc. - Funções Definidas pelo Usuário sem a tag
<deterministic>true</deterministic>na definição XML, - funções que retornam a data ou hora atual:
now(),today(),yesterday()etc., - funções que retornam valores aleatórios:
randomString(),fuzzBits()etc., - funções cujo resultado depende do tamanho e da ordem, ou dos fragmentos internos usados no processamento de consultas:
nowInBlock()etc.,rowNumberInBlock(),runningDifference(),blockSize()etc., - funções que dependem do ambiente:
currentUser(),queryID(),getMacro()etc.