Identificar os componentes de processamento de consulta

Concluído

Há quatro etapas separadas para executar a consulta. Na ordem de execução estas etapas são:

  1. Análise
  2. Transformação (Reescritor)
  3. Planeamento
  4. Execução

O analisador

O analisador é responsável por verificar a seqüência de caracteres de consulta para sintaxe válida. O analisador tem duas partes principais:

  • gram.y que é composto por um conjunto de regras gramaticais e ações correspondentes.
  • scan.1 o léxico , que reconhece identificadores e palavras-chave SQL. Cada palavra-chave ou identificador aciona um token que está sendo criado e entregue ao analisador.

O analisador cria uma árvore de consulta, que separa a consulta em partes identificáveis para entender quais tabelas estão envolvidas, quais filtros foram aplicados, etc. As partes de uma árvore de consulta são:

  • Tipo de comando - SELECT, INSERT, UPDATE ou DELETE.
  • Entrada de tabela de intervalo (RTE) - uma lista de relações, tabelas de ie, subconsultas, resultados de junções, etc. Em uma instrução SELECT, esses itens aparecem após a palavra-chave FROM.
  • Relação de resultado - a relação de resultado para os comandos INSERT, UPDATE e DELETE é a tabela ou exibição onde as alterações entrarão em vigor.
  • Lista de destino - os resultados da consulta, identificados entre as palavras-chave SELECT e FROM. Os comandos DELETE não produzem um resultado, então o planejador adiciona uma entrada especial para permitir que o executor encontre a linha a ser excluída. Os comandos INSERT identificam as novas linhas que devem entrar na relação de resultados. Para comandos UPDATE, a lista de destino descreve as novas linhas que devem substituir as antigas.
  • Qualificação - um valor booleano que especifica se a operação para a linha de resultado final deve ser executada ou não. Corresponde à cláusula WHERE de uma instrução SQL.
  • Join tree - esta árvore pode ser uma lista dos itens de origem. As junções podem ser feitas em qualquer ordem ou em uma ordem específica, como as junções externas.
  • Outros - itens que não são relevantes nesta fase, como a cláusula ORDER BY.

Reformulador

A saída do analisador é passada para o processo de transformação ou reescrita , a menos que um erro seja encontrado, caso em que uma mensagem de erro é retornada.

O reescritor de consultas reescreve o texto da consulta aplicando as regras sobre ele. O reescritor leva as regras em consideração e, em seguida, passa a consulta modificada para o planejador de consultas. A segurança em nível de linha é implementada neste estágio.

Por exemplo, as regras em SELECT são sempre aplicadas como a última etapa, inclusive para consultas INSERT, UPDATE e DELETE. As regras também significam que as consultas UPDATE não substituem as linhas existentes, em vez disso, uma nova linha é inserida e a linha antiga fica oculta. Depois que a transação é confirmada, o processo de vácuo pode remover a linha oculta.

Planejador

O trabalho do planejador é pegar as regras de consulta e entender qual das diferentes maneiras que a consulta pode ser executada é a mais rápida.

O planejador cria uma árvore de plano, com nós representando operações físicas nos dados.

O PostgreSQL usa um otimizador de consulta baseado em custo para encontrar o plano ideal para uma consulta. O planejador avalia vários planos de execução e estima quais recursos necessários, como ciclos de CPU, operações de E/S, etc., são precisos. Essa estimativa é então convertida em unidades, conhecidas como custo do plano. O plano com o menor custo é selecionado.

No entanto, à medida que o número de adesões aumenta, o número de planos possíveis cresce exponencialmente. Avaliar todos os planos possíveis torna-se impossível, mesmo para consultas relativamente simples. Heurísticas e algoritmos são usados para limitar o número de planos possíveis. O resultado é que o plano selecionado pode não ser o ideal. É quase ideal, no entanto, e selecionado em um tempo razoável.

O custo é a melhor estimativa do planejador. O objetivo da estimativa de custos é comparar diferentes planos de execução para a mesma consulta de nas mesmas condições. O planejador usa estatísticas coletadas em tabelas e linhas para produzir estimativas de custo para consultas. Para que as estimativas de custos sejam precisas, as estatísticas devem estar atualizadas.

Estatísticas atualizadas

O componente planejador do otimizador de consulta usa estatísticas sobre tabelas e linhas para produzir estimativas de custo precisas.

ANALYZE coleta estatísticas sobre tabelas de banco de dados e armazena os resultados no catálogo do sistema pg_statistic. Você precisa executar ANALYZE, se:

  • Você desativou de vácuo automático (que normalmente analisa tabelas automaticamente)
  • Você desativou de vácuo automático e não executou ANALYZE recentemente
  • Qualquer uma das opções anteriores, e existem muitas instruções de INSERT, UPDATE ou DELETE.

As estimativas de custos baseiam-se nas estatísticas atualizadas up-toe pode ser escolhido um plano ineficiente caso estejam desatualizadas. Quando nenhum parâmetro é passado para ANALYZE, todas as tabelas no banco de dados são examinadas.

A sintaxe para ANALYZE é:

ANALYZE [ VERBOSE ] [ ***table*** [ ( ***column*** [, ...] ) ] ]

VERBOSE exibe mensagens de progresso para mostrar qual tabela está sendo analisada, juntamente com algumas estatísticas.

Programe VACUUM e ANALYZE para funcionar diariamente durante um tempo de baixo uso. ANALYZE pode ser executado em paralelo com outras atividades, pois requer apenas um bloqueio de leitura na tabela de destino.

Testamenteiro

Esta fase pega o plano criado pelo planejador e o processa recursivamente para extrair o conjunto necessário de linhas. Cada vez que um nó de plano é chamado, o executor deve fornecer uma linha ou informar que terminou.

O executor avalia todos os quatro tipos de consulta SQL:

  • SELECIONAR
  • INSERIR
  • ATUALIZAÇÃO
  • SUPRIMIR

Para SELECT, o executor retorna cada linha de volta ao cliente como o conjunto de resultados.

Para INSERT, cada linha retornada é inserida na tabela especificada. Essa tarefa é feita em um nó de plano de nível superior especial chamado ModifyTable.

Para UPDATE, cada linha computada inclui todos os valores de coluna atualizados, mais o ID da linha de destino. Os dados são enviados para um nó ModifyTable, que cria uma linha atualizada e marca a linha antiga como excluída.

Para DELETE, a única coluna retornada pelo plano é a ID da linha. O nó ModifyTable usa o ID da linha para marcar a linha como excluída.