사용자는 질의문에 힌트를 주어 해당 질의 성능을 높일 수 있다. 질의 최적화기는 질의문에 대한 최적화 작업을 수행할 때 SQL 힌트를 참고하여 효율적인 실행 계획을 생성한다. CUBRID에서 지원하는 SQL 힌트는 테이블 조인 관련 힌트, 인덱스 관련 힌트, 통계 정보 관련 힌트가 있다.
CREATE /*+ NO_STATS */ [TABLE | CLASS] ...;
ALTER /*+ NO_STATS */ [TABLE | CLASS] ...;
CREATE /*+ NO_STATS */ INDEX ...;
ALTER /*+ NO_STATS */ INDEX ...;
DROP /*+ NO_STATS */ INDEX ...;
SELECT /*+ hint [ { hint } ... ] */
SELECT --+ hint [ { hint } ... ]
SELECT //+ hint [ { hint } ... ]
hint :
USE_NL[(spec-name[{, spec-name}...])]
USE_IDX[(spec-name[{, spec-name}...])]
USE_MERGE[(spec-name[{, spec-name}...])]
ORDERED
USE_DESC_IDX
NO_DESC_IDX
NO_COVERING_IDX
SQL 힌트는 더하기 기호(+)와 주석을 사용하여 지정한다. CUBRID는 이 주석을 공백에 의해 구분된 힌트의 리스트로 해석한다. 힌트 주석은 반드시 키워드 SELECT, CREATE, ALTER 등의 키워드 다음에 나타나야 하고, 더하기 기호(+)가 주석에서 첫 번째 문자로 시작되어야 한다.
다음은 심권호 선수가 메달을 획득한 연도와 메달 종류를 구하는 예제이다. 단, 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;
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.