Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.4.0 |  CUBRID 8.4.1 |  CUBRID 8.4.3 |  CUBRID 9.0.0 | 

내림차순 인덱스 스캔

설명

다음과 같이 내림차순 정렬이 있는 질의를 수행할 때 일반적으로 역순 인덱스(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 i_di_i 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

            2

            3

다음 예는 위와 질의가 같으며 이번에는 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