Estou tendo dificuldade em encontrar explicações 'leigas' de como os índices são armazenados em cache no PostgreSQL, portanto, gostaria de verificar a realidade de qualquer uma ou todas essas suposições:
- Os índices do PostgreSQL, como linhas, ficam no disco, mas podem ser armazenados em cache.
- Um índice pode estar inteiramente no cache ou não ter.
- Se ele é armazenado em cache ou não, depende da frequência com que é usado (conforme definido pelo planejador de consultas).
- Por esse motivo, a maioria dos índices 'sensíveis' estará no cache o tempo todo.
- Os índices vivem no mesmo cache (o
buffer cache
?) Que as linhas e, portanto, o espaço em cache usado por um índice não está disponível para as linhas.
Minha motivação para entender isso se segue de outra pergunta que fiz, onde foi sugerido que índices parciais possam ser usados em tabelas nas quais a maioria dos dados nunca será acessada.
Antes de fazer isso, gostaria de deixar claro que o emprego de um índice parcial gera duas vantagens:
- Reduzimos o tamanho do índice no cache, liberando mais espaço para as próprias linhas no cache.
- Reduzimos o tamanho da Árvore B, resultando em uma resposta mais rápida à consulta.
postgresql
performance
index-tuning
cache
dukedave
fonte
fonte
Respostas:
Brincando um pouco com pg_buffercache , eu poderia obter respostas para algumas de suas perguntas.
pg_buffercache
programas, a resposta é um SIM definitivo . Vale ressaltar que os dados temporários da tabela não são armazenados em cache aqui.EDITAR
Encontrei o excelente artigo de Jeremiah Peschka sobre armazenamento de tabelas e índices. Com informações de lá, eu poderia responder (2) também. Eu montei um pequeno teste para que você possa verificar isso sozinho.
Em suma, isso mostra que índices e tabelas podem ser armazenados em cache página por página; portanto, a resposta para (2) é NÃO .
E uma final para ilustrar as tabelas temporárias não armazenadas em cache aqui:
fonte
temp_buffers
) - para toda a tabela ou apenas a parte do disco. Eu esperaria o último. Pode ser um teste interessante ..As páginas de índice são buscadas quando uma consulta decide que será útil reduzir a quantidade de dados da tabela necessária para responder a uma consulta. Somente os blocos do índice navegaram para realizar a leitura. Sim, eles entram no mesmo pool shared_buffers em que os dados da tabela são armazenados. Ambos também são apoiados pelo cache do sistema operacional como uma segunda camada de cache.
Você pode facilmente ter 0,1% de um índice na memória ou 100% dele. A idéia de que a maioria dos índices "sensíveis" ficará no cache o tempo todo "fica mais difícil quando você tem consultas que tocam apenas um subconjunto de uma tabela. Um exemplo comum é se você tiver dados orientados ao tempo. Geralmente, esses navegam pelo final recente da tabela, raramente observando a história antiga. Lá, você pode encontrar todos os blocos de índice necessários para navegar até o final recente e na memória, enquanto poucos são necessários para navegar pelos registros anteriores.
As partes complicadas da implementação não são como os blocos entram no cache do buffer. São as regras sobre quando eles partem. A palestra My Inside the PostgreSQL Buffer Cache e as consultas de amostra incluídas lá podem ajudá-lo a entender o que está acontecendo lá e a ver o que realmente está se acumulando em um servidor de produção. Isso pode ser surpreendente. Há muito mais sobre todos esses tópicos no meu livro PostgreSQL 9.0 High Performance .
Índices parciais podem ser úteis porque reduzem o tamanho do índice e, portanto, são mais rápidos de navegar e deixam mais RAM para armazenar outras coisas em cache. Se sua navegação no índice for de tal forma que as partes tocadas estejam sempre na RAM, de qualquer maneira, isso pode não significar uma melhoria real.
fonte