

# Gerenciamento de planos de consulta do Aurora PostgreSQL
<a name="AuroraPostgreSQL.Optimize.Start"></a>

Com o gerenciamento de planos de consulta ativado para seu cluster de banco de dados do Aurora PostgreSQL, o otimizador gera e armazena planos de execução de consultas para qualquer declaração SQL processada mais de uma vez. O otimizador sempre define o status do primeiro plano gerado de uma declaração gerenciada como `Approved` e o armazena na visualização `dba_plans`. 

O conjunto de planos aprovados salvos para uma declaração gerenciada é conhecido como *linha de base de planos*. Enquanto a aplicação é executada, o otimizador pode gerar planos adicionais para as declarações gerenciadas. O otimizador define planos capturados adicionais para um status de `Unapproved`. 

Posteriormente, será possível decidir se os planos `Unapproved` apresentam boa performance e alterá-los para `Approved`, `Rejected` ou `Preferred`. Para fazer isso, você usa a função `apg_plan_mgmt.evolve_plan_baselines` ou `apg_plan_mgmt.set_plan_status`. 

Quando o otimizador gera um plano para uma instrução SQL, o gerenciamento de planos de consulta salva o plano na tabela `apg_plan_mgmt.plans`. Os usuários do banco de dados que receberam a função `apg_plan_mgmt` podem ver os detalhes do plano consultando a visualização `apg_plan_mgmt.dba_plans`. Por exemplo, a consulta a seguir lista os detalhes dos planos atualmente na visualização de um cluster de banco de dados do Aurora PostgreSQL que não esteja em produção.
+ `sql_hash`: um identificador da instrução SQL que é o valor de hash para o texto normalizado da instrução SQL.
+ `plan_hash`: um identificador exclusivo para o plano que é uma combinação do `sql_hash` e um hash do plano.
+ `status` – O status do plano. O otimizador pode executar um plano aprovado.
+ `enabled`: indica se o plano está pronto para uso (verdadeiro) ou não (falso).
+ `plan_outline`: uma representação do plano utilizada para recriar o plano de execução real. Os operadores na estrutura em árvore são mapeados para operadores na saída EXPLAIN.

A visualização `apg_plan_mgmt.dba_plans` tem muitas outras colunas que contêm todos os detalhes do plano, como quando ele foi utilizado pela última vez. Para obter detalhes completos, consulte [Referência da visualização apg\$1plan\$1mgmt.dba\$1plans da edição compatível do Aurora PostgreSQL](AuroraPostgreSQL.Optimize.dba_plans_view_Reference.md). 

## Normalização e o hash SQL
<a name="AuroraPostgreSQL.Optimize.Start.hash-and-normalization"></a>

Na visualização `apg_plan_mgmt.dba_plans`, identifique uma declaração gerenciada com um valor de hash SQL. O hash SQL é calculado com base em uma representação normalizada da declaração SQL que remove algumas diferenças, como os valores literais. 

O processo de *normalização* de cada declaração SQL preserva espaço e maiúsculas e minúsculas, para que você ainda possa ler e entender a essência da declaração SQL. A normalização remove ou substitui os itens a seguir.
+ Principais comentários do bloco
+ A palavra-chave EXPLAIN e as opções EXPLAIN e EXPLAIN ANALYZE
+ Espaços à direita
+ Todos os literais

Por exemplo, utilize a declaração a seguir.

```
/*Leading comment*/ EXPLAIN SELECT /* Query 1 */ * FROM t WHERE x > 7 AND y = 1; 
```

O gerenciamento de planos de consulta normaliza essa declaração da seguinte maneira:

```
SELECT /* Query 1 */ * FROM t WHERE x > CONST AND y = CONST; 
```

A normalização permite que o mesmo hash SQL seja utilizado para declarações SQL semelhantes que só podem ter diferenças nos valores literais ou de parâmetro. Em outras palavras, podem existir vários planos para o mesmo hash SQL, com um plano diferente que é ideal em condições diferentes.

**nota**  
Uma única declaração SQL utilizada com esquemas diferentes tem planos diferentes porque está vinculada ao esquema específico em tempo de execução. O planejador usa as estatísticas para vinculação do esquema para selecionar o plano ideal.

Para saber mais sobre como o otimizador seleciona um plano, consulte [Usar planos gerenciados do Aurora PostgreSQL](AuroraPostgreSQL.Optimize.UsePlans.md). Nessa seção, você pode aprender a usar `EXPLAIN` e `EXPLAIN ANALYZE` e visualizar um plano antes que ele seja realmente utilizado. Para obter detalhes, consulte [Analisar o plano selecionado pelo otimizador](AuroraPostgreSQL.Optimize.UsePlans.md#AuroraPostgreSQL.Optimize.UsePlans.AnalyzePlans). Para obter uma imagem que descreve o processo de seleção de um plano, consulte [Como o otimizador escolhe que plano executar.](AuroraPostgreSQL.Optimize.UsePlans.md#AuroraPostgreSQL.Optimize.UsePlans.ChoosePlans). 