사용자는 질의문에 힌트를 주어 해당 질의 성능을 높일 수 있다. 질의 최적화기는 질의문에 대한 최적화 작업을 수행할 때 SQL 힌트를 참고하여 효율적인 실행 계획을 생성한다. CUBRID에서 지원하는 SQL 힌트는 테이블 조인 관련 힌트, 인덱스 관련 힌트, 통계 정보 관련 힌트가 있다.
SELECT /*+ hint [ { hint } ... ] */
or
SELECT --+ hint [ { hint } ... ]
or
SELECT //+ hint [ { hint } ... ]
hint :
USE_NL[(spec-name[{, spec-name}...])]
USE_IDX[(spec-name[{, spec-name}...])]
USE_MERGE[(spec-name[{, spec-name}...])]
ORDERED
CREATE /*+ NO_STATS */ [TABLE | CLASS] ...;
ALTER /*+ NO_STATS */ [TABLE | CLASS] ...;
CREATE /*+ NO_STATS */ INDEX ...;
ALTER /*+ NO_STATS */ INDEX ...;
DROP /*+ NO_STATS */ INDEX ...;
SQL 힌트는 더하기 기호(+)와 주석을 사용하여 지정한다. CUBRID는 이 주석을 공백에 의해 구분된 힌트의 리스트로 해석한다. 힌트 주석은 반드시 키워드 SELECT, CREATE, ALTER 등의 키워드 다음에 나타나야 하고, 더하기 기호(+)가 주석에서 첫 번째 문자로 시작되어야 한다.
힌트 |
설명 |
---|---|
USE_NL |
테이블 조인과 관련한 힌트로서, 질의 최적화기 중첩 루프 조인 실행 계획을 만든다. |
USE_MERGE |
테이블 조인과 관련한 힌트로서, 질의 최적화기는 정렬 병합 조인 실행 계획을 만든다. |
ORDERED |
테이블 조인과 관련한 힌트로서, 질의 최적화기는 FROM 절에 명시된 테이블의 순서대로 조인하는 실행 계획을 만든다. FROM 절에서 왼쪽 테이블은 조인의 외부 테이블이 되고, 오른쪽 테이블은 내부 테이블이 된다. |
USE_IDX |
인덱스 관련한 힌트로서, 질의 최적화기는 명시된 테이블에 대해 인덱스 조인 실행 계획을 만든다. |
NO_STATS |
통계 정보 관련 힌트로서, 질의 최적화기는 통계 정보를 갱신하지 않는다. 따라서, 해당 질의의 성능은 향상되나, 통계 정보를 갱신하지 않으므로 질의 계획이 최적화되지 않음에 유의한다. |
다음은 심권호 선수가 메달을 획득한 연도와 메달 종류를 구하는 예제이다. 단, athlete 테이블을 외부 테이블로 하고 game 테이블을 내부 테이블로 하는 중첩 루프 조인 실행 계획을 만들어야 한다. 다음과 같은 질의로 표현이 되는데, 질의최적화기는 game 테이블을 외부 테이블로 하고, athlete 테이블을 내부 테이블로 하는 중첩 루프 조인 실행 계획을 만든다.
SELECT /*+ USE_NL ORDERED */ a.name, b.host_year, b.medal
FROM athlete a, game b WHERE a.name = 'Sim Kwon Ho' AND a.code = b.athlete_code;
=== <Result of SELECT Command in Line 1> ===
name host_year medal
=========================================================
'Sim Kwon Ho' 2000 'G'
'Sim Kwon Ho' 1996 'G'
2 rows selected.
다음은 데이터가 없는 분할 테이블(before_2008)의 삭제 성능을 높이기 위해 NO_STATS 힌트를 사용하여 질의 실행 시간을 확인하는 예제이다. participant2 테이블에는 100만 건 이상의 데이터가 있는 것으로 가정한다. 아래 실행 시간의 차이는 시스템 성능 및 데이터베이스 구성 방법에 따라 다를 수 있다.
-- NO_STATS 힌트 미사용
ALTER TABLE participant2 DROP partition before_2008;
SQL statement execution time: 31.684550 sec
Current transaction has been committed.
1 command(s) successfully processed.
-- NO_STATS 힌트 사용
ALTER /*+ NO_STATS */ TABLE participant2 DROP partition before_2008;
SQL statement execution time: 0.025773 sec
Current transaction has been committed.
1 command(s) successfully processed.