

# Aurora MySQL 힌트
<a name="AuroraMySQL.Reference.Hints"></a><a name="hints"></a>

Aurora MySQL 쿼리와 함께 SQL 힌트를 사용하여 성능을 미세 조정할 수 있습니다. 또한 힌트를 사용하여 예기치 않은 조건으로 인해 중요한 쿼리에 대한 실행 계획이 변경되는 것을 방지할 수 있습니다.

**작은 정보**  
힌트가 쿼리에 미치는 영향을 확인하려면 `EXPLAIN` 문에서 생성된 쿼리 계획을 검토합니다. 힌트가 있는 쿼리 계획과 없는 쿼리 계획을 비교합니다.

Aurora MySQL 버전 3에서는 MySQL Community Edition 8.0에서 사용 가능한 모든 힌트를 사용할 수 있습니다. 이러한 힌트에 대한 자세한 내용은 *MySQL 참조 설명서*의 [최적화 프로그램 힌트](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html)를 참조하세요.

다음 힌트는 Aurora MySQL 버전 2에서 사용할 수 있습니다. 이러한 힌트는 Aurora MySQL 버전 2의 해시 조인 기능을 사용하는 쿼리, 특히 병렬 쿼리 최적화를 사용하는 쿼리에 적용됩니다.

**PQ, NO\$1PQ**  
최적화 프로그램이 테이블별 또는 쿼리별로 병렬 쿼리를 사용하도록 할지 여부를 지정합니다.  
`PQ`는 최적화 프로그램이 지정된 테이블 또는 전체 쿼리(블록)에 대해 병렬 쿼리를 사용하도록 합니다. `NO_PQ`는 최적화 프로그램이 지정된 테이블 또는 전체 쿼리(블록)에 대해 병렬 쿼리를 사용하지 못하도록 합니다.  
이 힌트는 Aurora MySQL 버전 2.11 이상에서 사용할 수 있습니다. 다음 예시에서는 이 힌트를 사용하는 방법을 보여줍니다.  
테이블 이름을 지정하면 최적화 프로그램은 이러한 선별된 테이블에만 `PQ/NO_PQ` 힌트를 적용합니다. 테이블 이름을 지정하지 않으면 쿼리 블록의 영향을 받는 모든 테이블에 `PQ/NO_PQ` 힌트가 적용됩니다.

```
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**  
쿼리에 해시 조인 최적화 방법을 사용할지 여부를 선택할 수 있는 병렬 쿼리 최적화 프로그램의 기능을 설정하거나 해제합니다. `HASH_JOIN`을 사용하면 해당 메커니즘이 더 효율적인 경우 최적화 프로그램이 해시 조인을 사용할 수 있습니다. `NO_HASH_JOIN`은 최적화 프로그램이 쿼리에 해시 조인을 사용하지 못하게 합니다. 이 힌트는 Aurora MySQL 버전 2.08 이상에서 사용할 수 있습니다. Aurora MySQL 버전 3에서는 아무런 효과가 없습니다.  
다음 예시에서는 이 힌트를 사용하는 방법을 보여줍니다.  

```
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**  
해시 조인 쿼리에서 조인의 프로브 측에 지정된 테이블을 사용할지를 지정합니다. 쿼리는 프로브 테이블의 전체 내용을 읽는 대신 빌드 테이블의 열 값이 프로브 테이블에 있는지를 테스트합니다. `HASH_JOIN_PROBING` 및 `HASH_JOIN_BUILDING`을 사용하여 쿼리 텍스트 내에서 테이블을 재정렬하지 않고 해시 조인 쿼리가 처리되는 방법을 지정할 수 있습니다. 이 힌트는 Aurora MySQL 버전 2.08 이상에서 사용할 수 있습니다. Aurora MySQL 버전 3에서는 아무런 효과가 없습니다.  
다음 예제에서는 이 힌트를 사용하는 방법을 보여 줍니다. `HASH_JOIN_PROBING` 테이블에 `T2` 힌트를 지정하면 `NO_HASH_JOIN_PROBING` 테이블에 `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**  
해시 조인 쿼리에서 조인의 빌드 측에 지정된 테이블을 사용할지를 지정합니다. 쿼리는 이 테이블의 모든 행을 처리하여 다른 테이블과 상호 참조할 열 값 목록을 작성합니다. `HASH_JOIN_PROBING` 및 `HASH_JOIN_BUILDING`을 사용하여 쿼리 텍스트 내에서 테이블을 재정렬하지 않고 해시 조인 쿼리가 처리되는 방법을 지정할 수 있습니다. 이 힌트는 Aurora MySQL 버전 2.08 이상에서 사용할 수 있습니다. Aurora MySQL 버전 3에서는 아무런 효과가 없습니다.  
다음 예시에서는 이 힌트를 사용하는 방법을 보여줍니다. `HASH_JOIN_BUILDING` 테이블에 `T2` 힌트를 지정하면 `NO_HASH_JOIN_BUILDING` 테이블에 `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**  
쿼리의 테이블이 쿼리에 나열된 순서에 따라 조인되도록 지정합니다. 이는 세 개 이상의 테이블을 포함하는 쿼리에 유용합니다. 이는 MySQL `STRAIGHT_JOIN` 힌트를 대체하기 위한 것이며, MySQL [JOIN\$1FIXED\$1ORDER](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) 힌트에 해당합니다. 이 힌트는 Aurora MySQL 버전 2.08 이상에서 사용할 수 있습니다.  
다음 예시에서는 이 힌트를 사용하는 방법을 보여줍니다.  

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

**JOIN\$1ORDER**  
쿼리의 테이블에 대한 조인 순서를 지정합니다. 이는 세 개 이상의 테이블을 포함하는 쿼리에 유용합니다. 이는 MySQL [JOIN\$1ORDER](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) 힌트에 해당합니다. 이 힌트는 Aurora MySQL 버전 2.08 이상에서 사용할 수 있습니다.  
다음 예시에서는 이 힌트를 사용하는 방법을 보여줍니다.  

```
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**  
조인 순서에서 먼저 넣을 테이블을 지정합니다. 이는 세 개 이상의 테이블을 포함하는 쿼리에 유용합니다. 이는 MySQL [JOIN\$1PREFIX](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) 힌트에 해당합니다. 이 힌트는 Aurora MySQL 버전 2.08 이상에서 사용할 수 있습니다.  
다음 예시에서는 이 힌트를 사용하는 방법을 보여줍니다.  

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

**JOIN\$1SUFFIX**  
조인 순서에 마지막으로 넣을 테이블을 지정합니다. 이는 세 개 이상의 테이블을 포함하는 쿼리에 유용합니다. 이는 MySQL [JOIN\$1SUFFIX](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) 힌트에 해당합니다. 이 힌트는 Aurora MySQL 버전 2.08 이상에서 사용할 수 있습니다.  
다음 예시에서는 이 힌트를 사용하는 방법을 보여줍니다.  

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

해시 조인 쿼리 사용에 대한 자세한 내용은 [해시 조인을 사용하여 대규모 Aurora MySQL 조인 쿼리 최적화](AuroraMySQL.BestPractices.Performance.md#Aurora.BestPractices.HashJoin) 단원을 참조하십시오.