Database/Oracle

[Oracle] 인덱스 힌트(INDEX HINT)

Ma_Sand 2023. 4. 26. 23:54
반응형

인덱스 힌트란?

인덱스 힌트는 쿼리 실행 시 인덱스를 사용하도록 강제하는 주석이다. 잘못된 SQL문이나 부정확한 통계 정보로 인한 *옵티마이저의 잘못된 실행 계획을 바로 잡을 수 있다.

   *옵티마이저: CBO 방식에서 주어진 환경(통계 정보, SQL문) 하에서 최적의 실행 계획을 제공한다.

▷멀티라인 주석: SELECT /*+ [힌트절] */ ~
▷싱글라인 주석: --+
▷여러 개의 인덱스 힌트 사용 => /*+ [힌트절] [힌트절] ... */

SQL문에서 힌트절은 주석문 안에 표시하며, 잘못된 힌트절로 인해 에러를 반환하는 경우는 없다.

 

 

 

인덱스 힌트를 사용하는 이유

데이터베이스 최적화를 위해 쿼리 실행 계획을 개선하고 성능을 향상시키기 위함이다.

데이터베이스가 자동으로 최적의 실행 계획을 선택하지 못할 때, 인덱스 힌트를 사용하여 쿼리 실행 계획을 수동으로 지정할 수 있다.

그러나 인덱스 힌트를 남용하면 성능이 오히려 저하될 수 있으므로 신중히 사용해야 한다.

 

 

 

인덱스 힌트 사용 시 고려사항

  1. 인덱스 힌트를 사용하면 쿼리 실행 계획이 변경될 수 있다.
  2. 인덱스 힌트는 데이터베이스 엔진이 자동으로 최적화하는 실행 계획을 무시한다. 따라서 최적화된 실행 계획보다 성능이 저하될 수 있다.
  3. 데이터베이스 스키마가 변경될 경우 유지보수가 어려울 수 있다.
  4. 인덱스 힌트는 데이터베이스 종류마다 문법이 다르다.

 

반응형

 

인덱스 힌트 사용

1. INDEX() - 기본 인덱스 힌트(오름차순 정렬)

SELECT /*+ INDEX(test test_idx0) */
       seq, log_dt
FROM test
WHERE log_dt <= '20230426214200';

위의 select문을 실행시키는 경우에 **실행 계획을 클릭하면 인덱스가 RANGE SCAN된 걸 확인할 수 있다.

이때, where절에 조건문을 걸어놔야 인덱스를 탄다.

만약 내림차순으로 하고싶다면 힌트절을 INDEX_DESC()로 작성하면 된다.

=> order by절을 사용하지 않아도 인덱스 힌트절로 정렬할 수 있다.

 

**실행 계획: 동그라미 친 곳을 클릭하면 실행 계획을 확인할 수 있다.

 

 

2. INDEX_DESC() - 내림차순 정렬 인덱스 힌트

SELECT /*+ INDEX_DESC(test test_idx0) */
       seq, log_dt
FROM test
WHERE log_dt <= '20230426214200';

위의 select문을 실행시키는 경우에 인덱스가 RANGE SCAN DESCENDING된 걸 확인할 수 있다.

 

 

3. 복합 인덱스

SELECT /*+ INDEX(a test_idx0) INDEX(b test_idx1) */
       a.seq, a.log_dt, b.title
FROM test a, test1 b
WHERE a.seq = b.seq
AND   log_dt <= '20230426214200'
AND   title like 'log%';

 

 

 

 

출처:

https://kdarkdev.tistory.com/94

https://dataonair.or.kr/db-tech-reference/d-lounge/expert-column/?mod=document&uid=52344 

https://gent.tistory.com/306

반응형