

# Usar dicas de consulta T-SQL para melhorar a performance de consultas do Babelfish
<a name="babelfish-tsql-hints"></a>

A partir da versão 2.3.0, o Babelfish comporta o uso de dicas de consulta com `pg_hint_plan`. No Aurora PostgreSQL, `pg_hint_plan` é instalado por padrão. Para obter mais informações sobre a extensão `pg_hint_plan` para PostgreSQL, consulte [https://github.com/ossc-db/pg_hint_plan](https://github.com/ossc-db/pg_hint_plan). Para obter detalhes sobre a versão dessa extensão compatível com o Aurora PostgreSQL, consulte [Versões de extensão para o Amazon Aurora PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/AuroraPostgreSQL.Extensions.html) em *Notas de versão do Aurora PostgreSQL*. 

 O otimizador de consultas é projetado para encontrar o plano de execução ideal para uma instrução SQL. Ao selecionar um plano, o otimizador de consultas considera tanto o modelo de custo do mecanismo quanto as estatísticas de colunas e tabelas. No entanto, o plano sugerido pode não atender às necessidades de seus conjuntos de dados. Assim, as dicas de consulta abordam os problemas de performance para melhorar os planos de execução. Uma `query hint` é uma sintaxe adicionada ao padrão SQL que instrui o mecanismo do banco de dados sobre como executar a consulta. Por exemplo, uma dica pode instruir o mecanismo a seguir uma varredura sequencial e anular qualquer plano que o otimizador de consultas tenha selecionado. 

## Ativar as dicas de consulta T-SQL no Babelfish
<a name="babelfish-tsql-hints-turningon"></a>

No momento, o Babelfish ignora todas as dicas T-SQL por padrão. Para aplicar as dicas T-SQL, execute o comando `sp_babelfish_configure` com o valor de enable\_pg\_hint como ON.

```
EXECUTE sp_babelfish_configure 'enable_pg_hint', 'on' [, 'server']
```

É possível tornar as configurações permanentes para todo o cluster ao incluir a palavra-chave *server*. Para definir a configuração apenas para a sessão atual, não use server. 

Depois de ativar `enable_pg_hint`, o Babelfish aplica as dicas T-SQL a seguir.
+ Dicas de INDEX
+ Dicas de JOIN
+ Dica de FORCE ORDER
+ Dica de MAXDOP

Por exemplo, a sequência de comandos a seguir ativa `pg_hint_plan`.

```
1> CREATE TABLE t1 (a1 INT PRIMARY KEY, b1 INT);
2> CREATE TABLE t2 (a2 INT PRIMARY KEY, b2 INT);
3> GO    
1> EXECUTE sp_babelfish_configure 'enable_pg_hint', 'on';
2> GO
1> SET BABELFISH_SHOWPLAN_ALL ON;
2> GO
1> SELECT * FROM t1 JOIN t2 ON t1.a1 = t2.a2; --NO HINTS (HASH JOIN)
2> GO
```

Nenhuma dica é aplicada à instrução SELECT. O plano de consulta sem nenhuma dica é retornado.

```
QUERY PLAN                                                                                                                                                                                                                                
---------------------------------------------------------------------------
Query Text: SELECT * FROM t1 JOIN t2 ON t1.a1 = t2.a2
Hash Join (cost=60.85..99.39 rows=2260 width=16)
 Hash Cond: (t1.a1 = t2.a2)
 -> Seq Scan on t1 (cost=0.00..32.60 rows=2260 width=8)
 -> Hash (cost=32.60..32.60 rows=2260 width=8)
 -> Seq Scan on t2 (cost=0.00..32.60 rows=2260 width=8)
```

```
1> SELECT * FROM t1 INNER MERGE JOIN t2 ON t1.a1 = t2.a2;
2> GO
```

A dica de consulta é aplicada à instrução SELECT. A saída a seguir mostra que o plano de consulta com junção de mesclagem é retornado.

```
QUERY PLAN                                                                                                                                                                                                                                
---------------------------------------------------------------------------
Query Text: SELECT/*+ MergeJoin(t1 t2) Leading(t1 t2)*/ * FROM t1 INNER JOIN t2 ON t1.a1 = t2.a2
Merge Join (cost=0.31..190.01 rows=2260 width=16)
 Merge Cond: (t1.a1 = t2.a2)
 -> Index Scan using t1_pkey on t1 (cost=0.15..78.06 rows=2260 width=8)
 -> Index Scan using t2_pkey on t2 (cost=0.15..78.06 rows=2260 width=8)
```

```
1> SET BABELFISH_SHOWPLAN_ALL OFF;
2> GO
```

## Limitações
<a name="babelfish-tsql-hints-limitations"></a>

Ao usar as dicas de consulta, considere as seguintes limitações:
+ Se um plano de consulta for armazenado em cache antes da ativação de `enable_pg_hint`, as dicas não serão aplicadas na mesma sessão. Elas serão aplicadas na nova sessão.
+ Se nomes de esquemas forem fornecidos explicitamente, não será possível aplicar as dicas. Você pode usar aliases de tabela como uma solução alternativa.
+ Uma dica de consulta não pode ser aplicada a visualizações e subconsultas.
+ As dicas não funcionam para instruções UPDATE/DELETE com JOINs.
+ Uma dica de índice para um índice ou tabela inexistente é ignorada.
+ A dica FORCE ORDER não funciona para HASH JOINs e não ANSI JOINs.