T-SQL 쿼리 힌트를 사용하여 Babelfish 쿼리 성능 향상 - Amazon Aurora

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 섹션을 참조하세요. Aurora PostgreSQL에서 지원하는 이 확장 버전에 대한 자세한 내용은 Aurora PostgreSQL 릴리스 정보에서 Amazon Aurora PostgreSQL의 확장 버전을 참조하세요.

쿼리 최적화 프로그램은 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> 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

제한 사항

쿼리 힌트를 사용하는 동안 다음 제한 사항을 고려하세요.

  • enable_pg_hint가 설정되기 전에 쿼리 계획이 캐시되면 동일한 세션에서 힌트가 적용되지 않습니다. 새 세션에 적용됩니다.

  • 스키마 이름이 명시적으로 입력되면 힌트를 적용할 수 없습니다. 해결 방법으로 테이블 별칭을 사용할 수 있습니다.

  • 쿼리 힌트는 뷰 및 하위 쿼리에 적용할 수 없습니다.

  • JOIN이 포함된 UPDATE/DELETE 문에는 힌트가 적용되지 않습니다.

  • 존재하지 않는 인덱스 또는 테이블에 대한 인덱스 힌트는 무시됩니다.

  • FORCE ORDER 힌트는 HASH JOIN 및 비 ANSI JOIN에 적용되지 않습니다.