O Global plan cache (GPC) permite que conexões no PolarDB for PostgreSQL compartilhem planos de execução. Isso reduz a sobrecarga de memória por conexão e o custo de geração repetida de planos.
Como o GPC funciona
No PostgreSQL padrão, cada conexão mantém seu próprio cache de planos. Em grande escala, com centenas ou milhares de conexões simultâneas executando as mesmas consultas, cada conexão compila e armazena independentemente um plano idêntico. Esse comportamento multiplica o consumo de memória proporcionalmente ao número de conexões e aumenta o risco de erros de falta de memória (OOM).
O GPC transfere o armazenamento de planos para a memória compartilhada. Assim que uma conexão compila um plano, todas as conexões com a mesma chave de consulta o reutilizam diretamente, sem recompilação. O resultado é menor uso agregado de memória e execução mais rápida de consultas para instruções preparadas.
Os planos são compartilhados quando suas chaves de consulta correspondem. Uma chave de consulta consiste em:
Texto da consulta
ID do banco de dados
Caminho de busca
ID do usuário
Versões compatíveis
O GPC está disponível nas seguintes versões do PolarDB for PostgreSQL:
|
Versão do PostgreSQL |
Versão secundária mínima do mecanismo |
|
PostgreSQL 18 |
2.0.18.0.1.0 |
|
PostgreSQL 17 |
2.0.17.2.1.0 |
|
PostgreSQL 16 |
2.0.16.3.1.1 |
|
PostgreSQL 15 |
2.0.15.7.1.1 |
|
PostgreSQL 14 |
2.0.14.9.15.0 |
|
PostgreSQL 11 |
2.0.11.9.28.0 |
Para verificar sua versão secundária do mecanismo, execute SHOW polardb_version; ou visualize-a no console. Caso seu cluster não atenda ao requisito, atualize a versão secundária do mecanismo.
O GPC vem ativado por padrão em clusters que atendem aos requisitos de versão.
Limitações
O GPC oferece suporte apenas a instruções preparadas. Não há suporte para cache de planos em cenários PL/SQL.
Somente as instruções
SELECT,INSERT,UPDATEeDELETEtêm suporte.Não há suporte para tabelas temporárias.
Parâmetros
|
Parâmetro |
Descrição |
Padrão |
Dinâmico |
|
|
Memória compartilhada alocada para o GPC, em MB. Não deve exceder |
30 MB |
Não |
|
|
Escopo em que o GPC está ativo. |
0 |
Sim |
|
|
Frequência de remoção de entradas do GPC pouco utilizadas, em segundos. Intervalo: de 0 segundos a 24 horas. |
1800 s |
Sim |
|
|
Frequência de limpeza de entradas inválidas do GPC, em segundos. Máximo: (2^32 − 1) / 1000 segundos. |
60 s |
Sim |
|
|
Quantidade de entradas do GPC limpas por ciclo de remoção. Intervalo: 10–10000. |
100 |
Sim |
|
|
Número de tabelas hash usadas para armazenar entradas do GPC. Intervalo: 1–1024. Requer reinicialização do cluster para entrar em vigor. |
32 |
Não |
|
|
Limite máximo de entradas por tabela hash. Intervalo: 1–10000. Requer reinicialização do cluster para entrar em vigor. |
1024 |
Não |
Interação entre polar_gpc_mem e polar_enable_gpc_level:
O GPC fica ativo somente quando
polar_gpc_mem> 0 epolar_enable_gpc_level> 0.Se
polar_gpc_mem> 0, maspolar_enable_gpc_level= 0, as consultas existentes continuam usando planos em cache, porém novas consultas não são armazenadas em cache.Quando a memória compartilhada estiver cheia, novos planos serão armazenados localmente por sessão. Após a limpeza de entradas do GPC inválidas ou pouco utilizadas e a liberação de memória, o sistema move esses planos locais para o GPC.
Monitorar e gerenciar o GPC
A extensão polar_gpc fornece as visualizações de monitoramento e as funções de gerenciamento do GPC. Instale-a uma vez por banco de dados:
CREATE EXTENSION IF NOT EXISTS polar_gpc;
Visualizações
polar_stat_gpc — Estatísticas gerais de uso do GPC
SELECT * FROM polar_stat_gpc;
|
Coluna |
Descrição |
|
|
Total de tentativas de recuperar uma entrada correspondente do GPC |
|
|
Quantidade de vezes em que uma entrada correspondente foi encontrada no GPC |
|
|
Número de planos salvos com sucesso no GPC |
|
|
Contagem de falhas ao salvar um plano devido a erro temporário de OOM no GPC. Um aumento consistente indica que |
|
|
Vezes em que o sistema tentou adicionar um plano local ao GPC, mas outra sessão já o havia armazenado |
polar_gpc_plan — Uso de memória por entrada
SELECT * FROM polar_gpc_plan;
|
Coluna |
Descrição |
|
|
ID do plano de execução |
|
|
Nome da instrução preparada |
|
|
Texto da consulta |
|
|
Total de utilizações do plano |
|
|
Timestamp da utilização mais recente |
|
|
Indica se o plano é válido atualmente |
polar_gpc_plan_mcxt — Detalhes de MemoryContext por entrada
SELECT * FROM polar_gpc_plan_mcxt;
|
Coluna |
Descrição |
|
|
ID do plano de execução |
|
|
Nome do MemoryContext |
|
|
Memória total alocada |
|
|
Memória disponível dentro do contexto |
|
|
Memória em uso |
|
|
Quantidade de blocos de memória |
polar_gpc_plan_key — Chaves de consulta para cada entrada do GPC
SELECT * FROM polar_gpc_plan_key;
|
Coluna |
Descrição |
|
|
ID do plano |
|
|
Texto da consulta |
|
|
ID do banco de dados |
|
|
ID do processo |
|
|
Quantidade de parâmetros na consulta |
|
|
Caminho de busca no momento em que o plano foi armazenado |
|
|
ID do usuário |
polar_prepared_statement — Todas as instruções preparadas no GPC
SELECT * FROM polar_prepared_statement;
|
Coluna |
Descrição |
|
|
Indica se o plano de execução está salvo no GPC |
|
|
Indica se o plano é válido atualmente |
|
|
Indica se o plano é elegível para cache |
Funções
Limpar entradas inválidas do GPC
SELECT polar_gpc_evict_invalid_gpc();
Remove imediatamente as entradas inválidas do GPC. Se não for chamada manualmente, o sistema as limpa automaticamente no intervalo definido por polar_worker.gpc_clear_interval.
Remover entradas do GPC pouco utilizadas
SELECT polar_gpc_evict_live_gpc();
Remove imediatamente as entradas do GPC que não foram usadas recentemente. Caso não seja chamada manualmente, o sistema as remove automaticamente no intervalo definido por polar_worker.gpc_clear_interval.