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 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