본문 바로가기

프로그래밍/oracle

oracle에서 hint의 사용

반응형

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를 사용하면 처리 속도가 훨씬 빠른 것을 볼 수 있다. 오라클이 최적의 경로로 처리할 거라고 너무 믿지 말자. 힌트를 사용하면 훨씬 나은 결과를 얻을 수 있는 것이다

 

 


반응형