

# Usar o plano de explicação para melhorar a performance das consultas do Babelfish
<a name="working-with-babelfish-usage-notes-features.using.explain"></a>

A partir da versão 2.1.0, o Babelfish inclui duas funções que usam de forma transparente o otimizador do PostgreSQL para gerar planos de consulta estimados e reais para consultas T-SQL na porta do TDS. Essas funções são semelhantes ao uso de SET STATISTICS PROFILE ou SET SHOWPLAN\$1ALL com bancos de dados do SQL Server para identificar e melhorar consultas de execução lenta.

**nota**  
A obtenção de planos de consulta de funções, fluxos de controle e cursores não é compatível no momento. 

Na tabela, você pode encontrar uma comparação das funções de explicação do plano de consulta no SQL Server, no Babelfish e no PostgreSQL. 


|  SQL Server  | Babelfish  | PostgreSQL  | 
| --- | --- | --- | 
| SHOWPLAN\$1ALL  | BABELFISH\$1SHOWPLAN\$1ALL  | EXPLAIN  | 
| STATISTICS PROFILE  | BABELFISH\$1STATISTICS PROFILE  | EXPLAIN ANALYZE  | 
| Usa o otimizador do SQL Server  | Usa o otimizador do PostgreSQL  | Usa o otimizador do PostgreSQL  | 
| Formato de entrada e saída do SQL Server  | Formato de entrada do SQL Server e saída do PostgreSQL  | Formato de entrada e saída do PostgreSQL  | 
| Definido para a sessão  | Definido para a sessão  | Aplicar a uma declaração específica  | 
| É compatível com o seguinte: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AmazonRDS/latest/AuroraUserGuide/working-with-babelfish-usage-notes-features.using.explain.html)  | É compatível com o seguinte: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AmazonRDS/latest/AuroraUserGuide/working-with-babelfish-usage-notes-features.using.explain.html)  | É compatível com o seguinte: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AmazonRDS/latest/AuroraUserGuide/working-with-babelfish-usage-notes-features.using.explain.html)  | 

Use as funções do Babelfish da seguinte forma:
+ SET BABELFISH\$1SHOWPLAN\$1ALL [ON\$1OFF]: defina como ON (Ativo) para gerar um plano de execução de consulta estimado. Essa função implementa o comportamento do comando `EXPLAIN` do PostgreSQL. Use esse comando para obter o plano de explicação para determinada consulta.
+ SET BABELFISH\$1STATISTICS PROFILE [ON\$1OFF]: defina como ON (Ativo) para planos de execução de consulta reais. Essa função implementa o comportamento do comando `EXPLAIN ANALYZE` do PostgreSQL. 

Para obter mais informações sobre `EXPLAIN` e `EXPLAIN ANALYZE` do PostgreSQL, consulte [EXPLAIN](https://www.postgresql.org/docs/current/sql-explain.html) na documentação do PostgreSQL.

**nota**  
A partir da versão 2.2.0, você pode definir o parâmetro `escape_hatch_showplan_all` como *ignore* para evitar o uso do prefixo *BABELFISH\$1* na sintaxe dos comandos SET `SHOWPLAN_ALL` e `STATISTICS PROFILE` do SQL Server.

Por exemplo, a sequência de comandos a seguir ativa o planejamento de consulta e, depois, retorna um plano de execução de consulta estimado para a instrução SELECT sem executar a consulta. Esse exemplo usa o exemplo de banco de dados do SQL Server `northwind` usando a ferramenta de linha de comando `sqlcmd` para consultar a porta do TDS: 

```
1> SET BABELFISH_SHOWPLAN_ALL ON
2> GO
1> SELECT t.territoryid, e.employeeid FROM
2> dbo.employeeterritories e, dbo.territories t
3> WHERE e.territoryid=e.territoryid ORDER BY t.territoryid;
4> GO

QUERY PLAN                                                                                                                                                                                                                                      
------------------------------------------------------------------------------------                                                                                                              
Query Text: SELECT t.territoryid, e.employeeid FROM
dbo.employeeterritories e, dbo.territories t
WHERE e.territoryid=e.territoryid ORDER BY t.territoryid
Sort  (cost=6231.74..6399.22 rows=66992 width=10)
  Sort Key: t.territoryid NULLS FIRST
  ->  Nested Loop  (cost=0.00..861.76 rows=66992 width=10)  
        ->  Seq Scan on employeeterritories e  (cost=0.00..22.70 rows=1264 width=4)
              Filter: ((territoryid)::"varchar" IS NOT NULL)
        ->  Materialize  (cost=0.00..1.79 rows=53 width=6)
              ->  Seq Scan on territories t  (cost=0.00..1.53 rows=53 width=6)
```

Quando você terminar de revisar e ajustar sua consulta, desative a função como mostrado a seguir:

```
1> SET BABELFISH_SHOWPLAN_ALL OFF
```

Com BABELFISH\$1STATISTICS PROFILE definido como ON (Ativo), cada consulta executada retorna seu conjunto de resultados regular seguido de um conjunto de resultados adicional que mostra planos de execução de consulta reais. O Babelfish gera o plano de consulta que fornece o conjunto de resultados mais rápido quando invoca a instrução SELECT. 

```
1> SET BABELFISH_STATISTICS PROFILE ON
1>
2> GO
1> SELECT e.employeeid, t.territoryid FROM
2> dbo.employeeterritories e, dbo.territories t
3> WHERE t.territoryid=e.territoryid ORDER BY t.territoryid;
4> GO
```

O conjunto de resultados e o plano de consulta são retornados (esse exemplo mostra apenas o plano de consulta). 

```
QUERY PLAN                                                                                                                                                                                                                                
---------------------------------------------------------------------------
Query Text: SELECT e.employeeid, t.territoryid FROM
dbo.employeeterritories e, dbo.territories t
WHERE t.territoryid=e.territoryid ORDER BY t.territoryid
Sort  (cost=42.44..43.28 rows=337 width=10)
  Sort Key: t.territoryid NULLS FIRST                                                                                                                                               
  ->  Hash Join  (cost=2.19..28.29 rows=337 width=10)
       Hash Cond: ((e.territoryid)::"varchar" = (t.territoryid)::"varchar")
        ->  Seq Scan on employeeterritories e  (cost=0.00..22.70 rows=1270 width=36)
        ->  Hash  (cost=1.53..1.53 rows=53 width=6)
             ->  Seq Scan on territories t  (cost=0.00..1.53 rows=53 width=6)
```

Para saber mais sobre como analisar suas consultas e os resultados retornados pelo otimizador do PostgreSQL, consulte [explain.depesz.com](https://www.depesz.com/2013/04/16/explaining-the-unexplainable/). Para obter mais informações sobre EXPLAIN e EXPLAIN ANALYZE do PostgreSQL, consulte [EXPLAIN](https://www.postgresql.org/docs/current/sql-explain.html) na documentação do PostgreSQL. 

## Parâmetros que controlam as opções de explicação do Babelfish
<a name="working-with-babelfish-usage-notes-features.using.explain.parameters"></a>

Você pode usar os parâmetros mostrados na tabela a seguir para controlar o tipo de informação que é exibida pelo plano de consulta. 


| Parâmetro | Descrição | 
| --- | --- | 
| babelfishpg\$1tsql.explain\$1buffers | Um valor booliano que ativa (e desativa) as informações de uso do buffer para o otimizador. (Padrão: desativado) (Permitido: desativado, ativado)  | 
| babelfishpg\$1tsql.explain\$1costs | Um valor booliano que ativa (e desativa) as informações estimadas de inicialização e custo total para o otimizador. (Padrão: ativado) (Permitido: desativado, ativado)  | 
| babelfishpg\$1tsql.explain\$1format | Especifica o formato de saída do plano `EXPLAIN`. (Padrão: texto) (Permitido: texto, xml, json, yaml)  | 
| babelfishpg\$1tsql.explain\$1settings | Um valor booliano que ativa (ou desativa) a inclusão de informações sobre parâmetros de configuração na saída do plano EXPLAIN. (Padrão: desativado) (Permitido: desativado, ativado)  | 
| babelfishpg\$1tsql.explain\$1summary | Um valor booliano que ativa (ou desativa) informações resumidas, como o tempo total após o plano de consulta. (Padrão: ativado) (Permitido: desativado, ativado)  | 
| babelfishpg\$1tsql.explain\$1timing | Um valor booliano que ativa (ou desativa) o tempo real de inicialização e o tempo gasto em cada nó na saída. (Padrão: ativado) (Permitido: desativado, ativado)  | 
| babelfishpg\$1tsql.explain\$1verbose | Um valor booliano que ativa (ou desliga) a versão mais detalhada de um plano de explicação. (Padrão: desativado) (Permitido: desativado, ativado)  | 
| babelfishpg\$1tsql.explain\$1wal | Um valor booliano que ativa (ou desativa) a geração de informações de registro WAL como parte de um plano de explicação. (Padrão: desativado) (Permitido: desativado, ativado)  | 

Você pode conferir os valores de quaisquer parâmetros relacionados ao Babelfish em seu sistema usando o cliente do PostgreSQL ou do SQL Server. Execute o seguinte comando para obter os valores atuais dos parâmetros: 

```
1> execute sp_babelfish_configure '%explain%';
2> GO
```

Na saída a seguir, você pode ver que todas as configurações nesse cluster de banco de dados do Babelfish específico estão com seus valores padrão. Nem todas as saídas são mostradas neste exemplo.

```
             name                   setting                     short_desc
---------------------------------- -------- --------------------------------------------------------
babelfishpg_tsql.explain_buffers   off      Include information on buffer usage
babelfishpg_tsql.explain_costs     on       Include information on estimated startup and total cost
babelfishpg_tsql.explain_format    text     Specify the output format, which can be TEXT, XML, JSON, or YAML
babelfishpg_tsql.explain_settings  off      Include information on configuration parameters
babelfishpg_tsql.explain_summary   on       Include summary information (e.g.,totaled timing information) after the query plan 
babelfishpg_tsql.explain_timing    on       Include actual startup time and time spent in each node in the output
babelfishpg_tsql.explain_verbose   off      Display additional information regarding the plan
babelfishpg_tsql.explain_wal       off      Include information on WAL record generation

(8 rows affected)
```

Você pode alterar a configuração desses parâmetros usando `sp_babelfish_configure`, conforme mostrado no exemplo a seguir. 

```
1> execute sp_babelfish_configure 'explain_verbose', 'on';
2> GO
```

Se quiser tornar a configuração permanente em todo o cluster, inclua a palavra-chave *server*, conforme mostrado a seguir: 

```
1> execute sp_babelfish_configure 'explain_verbose', 'on', 'server';
2> GO
```