

# T-SQL 쿼리 힌트를 사용하여 Babelfish 쿼리 성능 향상
<a name="babelfish-tsql-hints"></a>

버전 2.3.0부터 Babelfish는 `pg_hint_plan`을 사용하여 쿼리 힌트 사용을 지원합니다. Aurora PostgreSQL에서는 `pg_hint_plan`이 기본적으로 설치됩니다. PostgreSQL 확장에 `pg_hint_plan`에 대한 자세한 내용은 [https://github.com/ossc-db/pg_hint_plan](https://github.com/ossc-db/pg_hint_plan) 섹션을 참조하세요. Aurora PostgreSQL에서 지원하는 이 확장 버전에 대한 자세한 내용은 **Aurora PostgreSQL 릴리스 정보에서 [Amazon Aurora PostgreSQL의 확장 버전](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/AuroraPostgreSQL.Extensions.html)을 참조하세요.

 쿼리 최적화 프로그램은 SQL 문에 대한 최적의 실행 계획을 찾도록 설계되었습니다. 계획을 선택할 때 쿼리 최적화 프로그램은 엔진의 비용 모델과 열 및 테이블 통계를 모두 고려합니다. 하지만 제안된 계획이 데이터 세트의 요구 사항을 충족하지 못할 수 있습니다. 따라서 쿼리 힌트는 성능 문제를 해결하여 실행 계획을 개선합니다. `query hint`는 쿼리 실행 방법에 대해 데이터베이스 엔진에 지시하는 SQL 표준에 추가된 구문입니다. 예를 들어 힌트는 엔진이 순차 스캔을 따르고 쿼리 최적화 프로그램이 선택한 계획을 재정의하도록 지시할 수 있습니다.

## Babelfish에서 T-SQL 쿼리 힌트 켜기
<a name="babelfish-tsql-hints-turningon"></a>

현재 Babelfish는 기본적으로 모든 T-SQL 힌트를 무시합니다. T-SQL 힌트를 적용하려면 enable\$1pg\$1hint 값을 ON으로 설정하여 `sp_babelfish_configure` 명령을 실행합니다.

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

*server* 키워드를 포함하여 클러스터 전체 수준에서 설정을 영구적으로 만들 수 있습니다. 현재 세션에 대해서만 설정을 구성하려면 서버를 사용하지 마세요.

`enable_pg_hint`가 ON으로 설정되면 Babelfish는 다음 T-SQL 힌트를 적용합니다.
+ INDEX 힌트
+ JOIN 힌트
+ FORCE ORDER 힌트
+ MAXDOP 힌트

예를 들어, 다음 명령 시퀀스가 `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
```

SELECT 문에는 힌트가 적용되지 않습니다. 힌트가 없는 쿼리 계획이 반환됩니다.

```
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
```

쿼리 힌트는 SELECT 문에 적용됩니다. 다음 출력은 병합 조인이 포함된 쿼리 계획이 반환되었음을 보여줍니다.

```
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
```

## 제한 사항
<a name="babelfish-tsql-hints-limitations"></a>

쿼리 힌트를 사용하는 동안 다음 제한 사항을 고려하세요.
+ `enable_pg_hint`가 설정되기 전에 쿼리 계획이 캐시되면 동일한 세션에서 힌트가 적용되지 않습니다. 새 세션에 적용됩니다.
+ 스키마 이름이 명시적으로 입력되면 힌트를 적용할 수 없습니다. 해결 방법으로 테이블 별칭을 사용할 수 있습니다.
+ 쿼리 힌트는 뷰 및 하위 쿼리에 적용할 수 없습니다.
+ JOIN이 포함된 UPDATE/DELETE 문에는 힌트가 적용되지 않습니다.
+ 존재하지 않는 인덱스 또는 테이블에 대한 인덱스 힌트는 무시됩니다.
+ FORCE ORDER 힌트는 HASH JOIN 및 비 ANSI JOIN에 적용되지 않습니다.