oracle에서 hint의 사용
Hint란?
select문을 실행시키면 DB의 옵티마이져가 조건절 또는 join절 등을 고려하여 액세스 경로를 결정한다. 이때 옵티마이저에게 모든 것을 맡기지 않고 사용자가 원하는 보다 좋은 액세스 경로를 선택할 수 있도록 하는 것이 Hint이다.
힌트의 사용 방법
힌트를 사용하는 방법은 "/*+ */"와 "--+"의 두 가지 방법이 있다.
/*+ */ 여러 라인에 걸쳐 기술할 때 사용.
--+ 오직 한 라인에만 기술할 수 있고 칼럼은 반드시 다음 라인에 기술해야 한다.
예제 : kkaok이라는 테이블이 있고 kkaok_indx라는 인덱스를 힌트에 사용한다고 가정한다.
SELECT /*+ INDEX(kkaok kkaok_indx) */ name,content FROM kkaok WHERE rownum<=2
SELECT --+ INDEX(kkaok kkaok_indx) name,content FROM kkaok WHERE rownum<=2
힌트의 접근방법
힌트의 접근방법에는 여러 가지가 있다. 이중에 자주 사용되어지는 몇가지만 알아보겠다.
/*+ CLUSTER(table_name) */
Cluster Scan을 선택하도록 지정한다. 따라서 clustered object들에만 적용된다.
/*+ INDEX(table_name index_name) */
지정된 index사용하도록 지정한다.
/*+ INDEX_ASC(table_name index_name) */
지정된 index를 오름차순으로 사용하도록 지정한다. Default로 Index Scan은 오름차순이다
/*+ INDEX_DESC(table_name index_name) */
지정된 index를 내림차순으로 사용하도록 지정한다.
힌트를 사용한 성능향상 테스트
50000만 건을 입력하고 전체 카운터를 가져오는 테스트를 해보겠다.
여기서의 소요시간은 서버환경이나 측정하는 방법에 따라 달라 질 수 있다. 하지만 상대적으로 비교해 볼 수는 있는 것이니 어떤 효과가 있는지를 알기에는 충분하다고 생각한다.
1. select count(idx) idx from 테이블명
- 소요시간 : 203ms
2. select /*+ index(테이블명 인덱스명) */ count(idx) idx from 테이블명
- 소요시간 : 15ms
카운터는 집계함수이지만 hint를 사용하면 처리 속도가 훨씬 빠른 것을 볼 수 있다. 오라클이 최적의 경로로 처리할 거라고 너무 믿지 말자. 힌트를 사용하면 훨씬 나은 결과를 얻을 수 있는 것이다
'프로그래밍 > oracle' 카테고리의 다른 글
oracle - SQL Server vs Oracle 함수 비교 (0) | 2012.08.17 |
---|---|
oracle - rowid와 rownum의 용도 및 예제 (0) | 2012.08.17 |
oracle - Optimizer Mode Setting 방법 (0) | 2012.08.17 |
oracle - Nested Loop Join과 Sort Merge Join (0) | 2012.08.17 |
oracle - mysql to oracle(perl) (0) | 2012.08.17 |