Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

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

USING INDEX 절

설명

USING INDEX 절은 질의에서 인덱스를 지정할 수 있도록 해서 질의 처리기가 적절한 인덱스를 선택할 수 있게 한다. USING INDEX 절은 SELECT, DELETE, UPDATE 문의 WHERE 절 다음에 지정되어야 한다.

USING INDEX 절은 강제로 순차 스캔 또는 인덱스 스캔이 사용되게 하거나, 성능에 유리한 인덱스가 포함되도록 한다.

USING INDEX 절에 인덱스 이름의 리스트가 지정된다면 질의 최적화기는 지정된 인덱스만을 대상으로 질의 실행 비용을 계산하고, 지정된 인덱스의 인덱스 스캔 비용과 순차 스캔 비용을 비교하여 최적의 실행 계획을 만든다(CUBRID는 실행 계획을 선택할 때 비용 기반의 질의 최적화를 수행한다).

USING INDEX 절은 ORDER BY 없이 원하는 순서로 결과를 얻고자 할 때 유용하게 사용될 수 있다. CUBRID는 인덱스 스캔을 하면 인덱스에 저장된 순서로 결과가 생성되는데, 한 테이블에 여러 인덱스가 있을 경우 특정 인덱스의 순서로 질의 결과를 얻고자 할 때 USING INDEX를 사용할 수 있다.

구문

SELECT . . . FROM . . . WHERE . . .
[USING INDEX { NONE | index_spec [ {, index_spec } ...] } ] [ ; ]
DELETE FROM . . . WHERE . . .
[USING INDEX { NONE | index_spec [ {, index_spec } ...] } ] [ ; ]
UPDATE . . . SET . . . WHERE . . .
[USING INDEX { NONE | index_spec [ {, index_spec } ...] } ] [ ; ] 

index_spec :
 [table_name.]index_name [(+)]

  • NONE : NONE을 지정한 경우 순차 스캔이 사용된다.
  • (+) : 인덱스 이름 뒤에 (+)를 지정하면 해당 인덱스 스캔이 사옹된다.
예제

다음은 athlete 테이블의 생성문에 맞추어 인덱스를 생성한 예제이다.

CREATE TABLE athlete (

   code             SMALLINT    NOT NULL PRIMARY KEY,

   name             VARCHAR(40) NOT NULL,

   gender           CHAR(1)     ,

   nation_code      CHAR(3)     ,

   event            VARCHAR(30)

   );

CREATE UNIQUE INDEX athlete_idx ON athlete(code, nation_code);

CREATE INDEX char_idx ON athlete(gender, nation_code);

다음 질의에 대해서 질의 최적화기는 athlete_idx 인덱스를 사용하는 인덱스 스캔을 선택할 수 있다.

SELECT * FROM athlete WHERE gender='M' AND nation_code='USA';

다음 질의에서와 같이 USING INDEX char_idx를 지정하면 질의 최적화기는 USING INDEX에서 지정한 인덱스만을 대상으로 인덱스 스캔 비용을 산출한다.

인덱스 스캔 비용이 순차 스캔 비용보다 작을 경우 인덱스 스캔을 하게 된다.

SELECT * FROM athlete WHERE gender='M' AND nation_code='USA'

USING INDEX char_idx;

char_idx 인덱스를 사용하는 인덱스 스캔을 강제로 지정할 경우에는 다음과 같이 인덱스 이름 뒤에 (+)를 지정한다.

SELECT * FROM athlete WHERE gender='M' AND nation_code='USA'

USING INDEX char_idx(+);

순차 스캔을 선택하도록 할 경우 다음과 같이 USING INDEX 절에서 NONE을 지정한다.

SELECT * FROM athlete WHERE gender='M' AND nation_code='USA'

USING INDEX NONE;

다음과 같이 USING INDEX 절에서 두 개 이상의 인덱스를 지정한 경우 질의 최적화기는 지정된 인덱스 중 적절한 하나를 선택한다.

SELECT * FROM athlete WHERE gender='M' AND nation_code='USA'

USING INDEX char_idx, athlete_idx;

여러 개의 테이블에 대해 질의를 수행하는 경우, 한 테이블에서는 특정 인덱스를 사용하여 인덱스 스캔을 하고 다른 테이블에서는 순차 스캔을 하도록 지정할 수 있다. 이러한 질의는 다음과 같은 형태가 된다.

SELECT ... FROM tab1, tab2 WHERE ... USING INDEX tab1.idx1, tab2.NONE;

USING INDEX 절이 있는 질의를 수행할 때 질의 최적화기는 인덱스가 지정되지 않는 테이블에 대해서는 해당 테이블의 사용 가능한 모든 인덱스를 고려한다. 예를 들어, tab1 테이블에는 인덱스 idx1, idx2이 있고 tab2 테이블에는 인덱스 idx3, idx4, idx5가 있는 경우, tab1에 대한 인덱스만 지정하고 tab2에 대한 인덱스를 지정하지 않으면 질의 최적화기는 tab2의 인덱스도 고려하여 동작한다.

SELECT ... FROM tab1, tab2 WHERE ... USING INDEX tab1.idx1;

  • 테이블 tab1의 순차 스캔과 idx1 인덱스 스캔을 비교하여, 최상의 질의 계획을 선택한다.
  • 테이블 tab2의 순차 스캔과 idx3, idx4, idx5 인덱스 스캔을 비교하여, 최상의 질의 계획을 선택한다.

tab2 테이블만 인덱스 스캔을 하고 tab1 테이블은 순차 스캔을 하도록 하려면 tab1.NONE을 지정하여 tab1 테이블에 대해 인덱스 스캔을 하지 않도록 명시한다.

SELECT * from tab1,tab2 WHERE tab1.id > 2 and tab2.id < 3 USING index i_tab2_id, tab1.NONE;