devnoong.log
article thumbnail
Published 2022. 7. 27. 16:26
[DB] 힌트에 대해서 DB/Oracle
728x90

힌트(Hint)란?

오라클 옵티마이저(Optimizer) 대신 개발자가 직접 최적의 실행 경로를 작성해 주는 것이다.

 

단, 힌트, 인덱스, 조인의 개념을 정확히 알고 사용하지 않은 무분별한 힌트의 사용은 성능의 저하를 초래하기 때문에 최적의 실행 경로를 알고 있을 경우 적절하게 사용하여야 한다.

사용이유

Select 조회 컬럼이 인덱스 컬럼으로만 구성되어 있을 경우, 인덱스 영역에서 스캔하기때문에 조회 속도도 빠르고 인덱스 컬럼이 설정된 대로 정렬이 돼서 조회가 된다.

 

하지만 인덱스컬럼뿐만 아니라 다른 컬럼도 포함되어 있을 경우 FullTableScan을 시도하기때문에 조회 속도가 느리고 정렬이 되지 않는다.

 

하지만 힌트절을 사용한다면, 인덱스 영역에서 인덱스가 생성된 순서대로 스캐닝을 시도하고 정의 해놓은대로 정렬이 같이 실행된다.

 

사용법

 

기본적으로 힌트 사용할때는 /*+       힌트명령문      */ 형태로 사용한다. (주석이랑 비슷하지만 다른 형태임)

 

힌트안의 괄호에 명시되는 테이블은 테이블명이나 ALIAS(별칭)으로 정의가능하고, 별칭을 사용하는 것을 추천한다.

테이블명을 작성할때에는 디비스키마까지 포함해서 작성하지 않는다.

 

https://gent.tistory.com/306

 

하나의 힌트절 안에 여러개의 힌트 명령문에 대해 입력 가능하다.

대신 스페이스바(공백)으로 구분을 해줘야 한다. (쉼표로 연결하면 인식이 되지 않는다. )

 

SELECT /*+index(dual,indxName) */ * FROM DUAL  // 한개 사용

SELECT /*+index(dual,indxName) index(dual,indxName2) */ * FROM DUAL  // 두개 사용( 공백 이용)

 


 

테스트를 위해 Oracle Live SQL 사이트를 이용하도록 하겠습니다.

https://livesql.oracle.com/

 

Oracle Live SQL

This tutorial provides an introduction to the Structured Query Language (SQL), learn how to create tables with primary keys, columns, constraints, ind...

livesql.oracle.com

 

먼저 인덱스가 존재하는지 조회해보기 위해서는 ALL_IND_COLUMNS VIEW를 통해 확인해보도록 하겠습니다.

 

 

계정별로 많은 인덱스가 기본적으로 제공되고 있지만 HR계정의 EMPLOYEES 테이블에 대한 인덱스를 활용해보도록 하겠습니다.

 

select * from ALL_IND_COLUMNS where index_owner='HR' and table_name='EMPLOYEES';

 

기본적으로 hr계정의 EMPLOYEES 테이블을 조회했을때는 아래와 같이 조회됩니다.

 

select * from hr.EMPLOYEES;

 

EMPLOYEE_ID를 기준으로 오름차순 정렬된것을 확인 할 수 있습니다.

 

조금 더 자세히 파악하기 위해 실행 계획을 수행해보면,

 

EXPLAIN PLAN FOR select A.* from hr.EMPLOYEES A;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());

 

전체 컬럼을 조회하였기때문에 TABLE ACCESS FULL이 발생한 내역을 확인 할 수 있습니다.

 

 

이제 EMP_NAME_IX 인덱스를 이용한 힌트절로 수행해보도록 하겠습니다.

 

select /*+ index(A EMP_NAME_IX)*/ A.* from hr.EMPLOYEES A;

or

select /*+ index_asc(A EMP_NAME_IX)*/ A.* from hr.EMPLOYEES A;

 

ORDER BY를 사용하지도 않고 EMP_NAME_IX 인덱스를 이용하여 정렬 기준을 First_name 오름차순으로 변경 가능합니다.

 

실행 계획을 수행해보면

 

EXPLAIN PLAN FOR select /*+ index(A EMP_NAME_IX)*/  A.* from hr.EMPLOYEES A;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());

 

동일하게 전체컬럼을 조회했음에도 불구하고 TABLE ACCESS FULL에서 INDEX FULL SCAN으로 변경된 것을 확인 하실 수 있습니다.

728x90

'DB > Oracle' 카테고리의 다른 글

[DB] ORACLE PARALLEL HINT 부여하기  (0) 2023.02.07
[DB] SELECT ~ FOR UPDATE 문 사용 법  (0) 2022.11.10
[DB] 힌트 예제 정리  (0) 2022.07.28
[DB] INDEX에 대해서  (0) 2022.07.27
[DB] Oracle 바로 사용하기  (0) 2022.07.27