다음과 같이 내림차순 정렬이 있는 질의를 수행할 때에는 일반적으로 역순 인덱스(reverse index)를 생성한다.
SELECT * FROM tab [WHERE ...] ORDER BY a DESC
그런데 같은 컬럼에 대해 오름차순 인덱스와 내림차순 인덱스를 생성하면 교착 상태(deadlock)의 발생 가능성이 높아진다. 이러한 경우를 줄이기 위해 CUBRID는 별도의 내림차순 인덱스를 생성하지 않아도 내림차순 인덱스 스캔을 사용할 수 있다. 사용자는 USE_DESC_IDX 힌트를 사용하여 내림차순 스캔을 사용하도록 명시할 수 있다. 이 힌트가 명시되지 않으면 ORDER BY 절에 나열된 컬럼이 인덱스를 사용할 수 있다는 전제 조건 하에서 아래의 3가지 질의 실행 계획을 고려할 수 있다.
내림차순 스캔을 위해 USE_DESC_IDX 힌트가 생략된다 하더라도 질의 최적화기는 위에서 나열한 3가지 중 제일 마지막 실행 계획을 최적의 계획으로 결정한다.
참고 USE_DESC_IDX 힌트는 조인 질의에 대해서는 지원하지 않는다.
CREATE TABLE di (i INT);
CREATE INDEX on di (i);
INSERT INTO di VALUES (5),(3),(1),(4),(3),(5),(2),(5);
다음 예는 USE_DESC_IDX 힌트를 사용하여 질의를 수행한다.
-- We now run the following query, using the ''use_desc_idx'' SQL hint:
SELECT /*+ USE_DESC_IDX */ * FROM di WHERE i > 0 LIMIT 3;
Query plan:
Index scan(di di, i_di_i, (di.i range (0 gt_inf max) and inst_num() range (min inf_le 3)) (covers) (desc_index))
i
=============
5
5
5
다음 예는 위와 질의가 같더라도 USE_DESC_IDX 힌트가 없어 내림차순 스캔이 되지 않으므로 출력 결과가 다를 수 있다.
-- The same query, without the hint, will have a different output, since descending scan is not used.
SELECT * FROM di WHERE i > 0 LIMIT 3;
Query plan:
Index scan(di di, i_di_i, (di.i range (0 gt_inf max) and inst_num() range (min inf_le 3)) (covers))
i
=============
1
1
1
다음 예는 위와 질의가 같으며 이번에는 ORDER BY DESC에 의해 내림차순 정렬을 요청한다. 이 경우 USE_DESC_IDX 힌트가 없지만 내림차순 스캔이 되어 첫번째 예와 출력 결과가 같다.
-- We also run the same query , this time asking that the results are displayed in descending order. However, no hint will be given. Since the
-- ORDER BY...DESC clause is present, CUBRID will use descending scan, even if the hint is was not given, thus avoiding to sort the records.
SELECT * FROM di WHERE i > 0 ORDER BY i DESC LIMIT 3;
Query plan:
Index scan(di di, i_di_i, (di.i range (0 gt_inf max)) (covers) (desc_index))
i
=============
5
5
5