

# Dicas do Aurora MySQL
<a name="AuroraMySQL.Reference.Hints"></a><a name="hints"></a>

É possível usar dicas SQL com consultas do Aurora MySQL para ajustar a performance. Também é possível usar dicas para impedir que planos de execução para consultas importantes sejam alterados devido a condições imprevisíveis.

**dica**  
Para verificar o efeito que uma dica tem em uma consulta, examine o plano de consulta produzido pela instrução `EXPLAIN`. Compare os planos de consulta com e sem a dica.

No Aurora MySQL versão 3, é possível usar todas as dicas disponíveis no MySQL Community Edition 8.0. Para ter mais informações sobre essas dicas, consulte [Dicas do Optimizer](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) no *Guia de referência do MySQL*.

As dicas a seguir estão disponíveis no Aurora MySQL versão 2. Elas se aplicam a consultas que usam o recurso de junção de hash no Aurora MySQL versão 2, especialmente a consultas que usam a otimização de consultas paralelas.

**PQ, NO\$1PQ**  
Especifica se deve forçar o Optimizer a usar a consulta paralela por tabela ou por consulta.  
`PQ` força o Optimizer a usar a consulta paralela para tabelas especificadas ou para toda a consulta (bloco). `NO_PQ` impede que o Optimizer use a consulta paralela para tabelas especificadas ou para toda a consulta (bloco).  
Esta dica está disponível no Aurora MySQL versão 2.11 e posterior. Os exemplos a seguir mostram como usar essa dica.  
A especificação de um nome de tabela força o Optimizer a aplicar a dica `PQ/NO_PQ` somente às tabelas selecionadas. Não especificar um nome de tabela força a dica `PQ/NO_PQ` em todas as tabelas afetadas pelo bloco de consulta.

```
EXPLAIN SELECT /*+ PQ() */ f1, f2
    FROM num1 t1 WHERE f1 > 10 and f2 < 100;

EXPLAIN SELECT /*+ PQ(t1) */ f1, f2
    FROM num1 t1 WHERE f1 > 10 and f2 < 100;

EXPLAIN SELECT /*+ PQ(t1,t2) */ f1, f2
    FROM num1 t1, num1 t2 WHERE t1.f1 = t2.f21;

EXPLAIN SELECT /*+ NO_PQ() */ f1, f2
    FROM num1 t1 WHERE f1 > 10 and f2 < 100;

EXPLAIN SELECT /*+ NO_PQ(t1) */ f1, f2
    FROM num1 t1 WHERE f1 > 10 and f2 < 100;

EXPLAIN SELECT /*+ NO_PQ(t1,t2) */ f1, f2
    FROM num1 t1, num1 t2 WHERE t1.f1 = t2.f21;
```

**HASH\$1JOIN, NO\$1HASH\$1JOIN**  
Ativa ou desativa a capacidade do Optimizer de consulta paralela de escolher se deseja usar o método de otimização de junção de hash para uma consulta. `HASH_JOIN` permite que o Optimizer use junção de hash se esse mecanismo for mais eficiente. `NO_HASH_JOIN` impede que o Optimizer use junção de hash para a consulta. Esta dica está disponível no Aurora MySQL versão 2.08 e posterior. Ela não tem efeito no Aurora MySQL versão 3.  
Os exemplos a seguir mostram como usar essa dica.  

```
EXPLAIN SELECT/*+ HASH_JOIN(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;

EXPLAIN SELECT /*+ NO_HASH_JOIN(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;
```

**HASH\$1JOIN\$1PROBING, NO\$1HASH\$1JOIN\$1PROBING**  
Em uma consulta de junção de hash, especifica se deve ou não usar a tabela especificada para o lado de teste da junção. A consulta testa se os valores de coluna da tabela de compilação existem na tabela de teste, em vez de ler todo o conteúdo da tabela de teste. É possível usar `HASH_JOIN_PROBING` e `HASH_JOIN_BUILDING` para especificar como as consultas de junção hash são processadas sem reordenar as tabelas dentro do texto da consulta. Esta dica está disponível no Aurora MySQL versão 2.08 e posterior. Ela não tem efeito no Aurora MySQL versão 3.  
Os exemplos a seguir mostram como usar essa dica. Especificar a dica `HASH_JOIN_PROBING` para a tabela `T2` tem o mesmo efeito que especificar `NO_HASH_JOIN_PROBING` para a tabela `T1`.  

```
EXPLAIN SELECT /*+ HASH_JOIN(t2) HASH_JOIN_PROBING(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;

EXPLAIN SELECT /*+ HASH_JOIN(t2) NO_HASH_JOIN_PROBING(t1) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;
```

**HASH\$1JOIN\$1BUILDING, NO\$1HASH\$1JOIN\$1BUILDING**  
Em uma consulta de junção de hash, especifica se deve ou não usar a tabela especificada para o lado de compilação da junção. A consulta processa todas as linhas desta tabela para criar a lista de valores de coluna para referência cruzada com a outra tabela. É possível usar `HASH_JOIN_PROBING` e `HASH_JOIN_BUILDING` para especificar como as consultas de junção hash são processadas sem reordenar as tabelas dentro do texto da consulta. Esta dica está disponível no Aurora MySQL versão 2.08 e posterior. Ela não tem efeito no Aurora MySQL versão 3.  
Os exemplos a seguir mostram como usar essa dica. Especificar a dica `HASH_JOIN_BUILDING` para a tabela `T2` tem o mesmo efeito que especificar `NO_HASH_JOIN_BUILDING` para a tabela `T1`.  

```
EXPLAIN SELECT /*+ HASH_JOIN(t2) HASH_JOIN_BUILDING(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;

EXPLAIN SELECT /*+ HASH_JOIN(t2) NO_HASH_JOIN_BUILDING(t1) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;
```

**JOIN\$1FIXED\$1ORDER**  
Especifica que as tabelas na consulta são unidas com base na ordem em que são listadas na consulta. É útil com consultas que envolvem três ou mais tabelas. Deve ser um substituto da dica `STRAIGHT_JOIN` do MySQL e é equivalente à dica [JOIN\$1FIXED\$1ORDER](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) do MySQL. Esta dica está disponível no Aurora MySQL versão 2.08 e posterior.  
Os exemplos a seguir mostram como usar essa dica.  

```
EXPLAIN SELECT /*+ JOIN_FIXED_ORDER() */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);
```

**JOIN\$1ORDER**  
Especifica a ordem de junção para as tabelas na consulta. É útil com consultas que envolvem três ou mais tabelas. É equivalente à dica [JOIN\$1ORDER](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) do MySQL. Esta dica está disponível no Aurora MySQL versão 2.08 e posterior.  
Os exemplos a seguir mostram como usar essa dica.  

```
EXPLAIN SELECT /*+ JOIN_ORDER (t4, t2, t1, t3) */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);
```

**JOIN\$1PREFIX**  
Especifica as tabelas a serem colocadas em primeiro lugar na ordem de junção. É útil com consultas que envolvem três ou mais tabelas. É equivalente à dica [JOIN\$1PREFIX](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) do MySQL. Esta dica está disponível no Aurora MySQL versão 2.08 e posterior.  
Os exemplos a seguir mostram como usar essa dica.  

```
EXPLAIN SELECT /*+ JOIN_PREFIX (t4, t2) */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);
```

**JOIN\$1SUFFIX**  
Especifica as tabelas a serem colocadas por último na ordem de junção. É útil com consultas que envolvem três ou mais tabelas. É equivalente à dica [JOIN\$1SUFFIX](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) do MySQL. Esta dica está disponível no Aurora MySQL versão 2.08 e posterior.  
Os exemplos a seguir mostram como usar essa dica.  

```
EXPLAIN SELECT /*+ JOIN_SUFFIX (t1) */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);
```

Para obter informações sobre como usar consultas de junção de hash, consulte [Otimizando grandes consultas de junção do Aurora MySQL com junções hash](AuroraMySQL.BestPractices.Performance.md#Aurora.BestPractices.HashJoin).