T-SQL 쿼리 힌트를 사용하여 Babelfish 쿼리 성능 향상
버전 2.3.0부터 Babelfish는 pg_hint_plan
을 사용하여 쿼리 힌트 사용을 지원합니다. Aurora PostgreSQL에서는 pg_hint_plan
이 기본적으로 설치됩니다. PostgreSQL 확장에 pg_hint_plan
에 대한 자세한 내용은 https://github.com/ossc-db/pg_hint_plan
쿼리 최적화 프로그램은 SQL 문에 대한 최적의 실행 계획을 찾도록 설계되었습니다. 계획을 선택할 때 쿼리 최적화 프로그램은 엔진의 비용 모델과 열 및 테이블 통계를 모두 고려합니다. 하지만 제안된 계획이 데이터 세트의 요구 사항을 충족하지 못할 수 있습니다. 따라서 쿼리 힌트는 성능 문제를 해결하여 실행 계획을 개선합니다. query hint
는 쿼리 실행 방법에 대해 데이터베이스 엔진에 지시하는 SQL 표준에 추가된 구문입니다. 예를 들어 힌트는 엔진이 순차 스캔을 따르고 쿼리 최적화 프로그램이 선택한 계획을 재정의하도록 지시할 수 있습니다.
Babelfish에서 T-SQL 쿼리 힌트 켜기
현재 Babelfish는 기본적으로 모든 T-SQL 힌트를 무시합니다. T-SQL 힌트를 적용하려면 enable_pg_hint 값을 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>
GO1>
EXECUTE sp_babelfish_configure 'enable_pg_hint', 'on';2>
GO1>
SET BABELFISH_SHOWPLAN_ALL ON;2>
GO1>
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
제한 사항
쿼리 힌트를 사용하는 동안 다음 제한 사항을 고려하세요.
-
enable_pg_hint
가 설정되기 전에 쿼리 계획이 캐시되면 동일한 세션에서 힌트가 적용되지 않습니다. 새 세션에 적용됩니다. -
스키마 이름이 명시적으로 입력되면 힌트를 적용할 수 없습니다. 해결 방법으로 테이블 별칭을 사용할 수 있습니다.
-
쿼리 힌트는 뷰 및 하위 쿼리에 적용할 수 없습니다.
-
JOIN이 포함된 UPDATE/DELETE 문에는 힌트가 적용되지 않습니다.
-
존재하지 않는 인덱스 또는 테이블에 대한 인덱스 힌트는 무시됩니다.
-
FORCE ORDER 힌트는 HASH JOIN 및 비 ANSI JOIN에 적용되지 않습니다.