Oracle sql 바인드 변수, 인덱스 힌트 정리


oracle DB에 있는 바인드 변수, 인덱스 힌트를 정리하려 합니다.


1.바인드 변수

바인드 변수는 쿼리 재사용성을 높이기 위해

변수를 설정하고 값을 할당할 수 있다.

VAR V1 NUMBER;

EXEC :V1 := 1;

SELECT :V1 AS C1 FROM DUAL; --C1열에 1이 입력된 결과가 출력됨

VAR 명령어로 변수를 선언하고

EXEX 명령어로 값을 할당한다.

할당하고 실행을 할 때에는 : 구분자를 추가로 해서 사용한다.

12.1 버전부터는 선언한 변수에 값을 바로 할당할 수 있게 되었다.

VAR V1 NUMBER :=3 ;

SELECT :V1 AS C1 FROM DUAL; --C1열에 3이 입력된 결과가 출력됨


추가로 DBEAVER에서는 VAR 선언 및 EXEC 실행 없이

쿼리 내에 :를 활용하게 되면 추가로 변수 값 입력 팝업창이 뜨게 된다.

문자형(작은 따음표 포함), 숫자형 등 쿼리에 맞는 값을 입력하면

쿼리 실행이 된다.

추가로 변수명을 동일하게 설정해두면 이전에 입력해 놓은 값을

그대로도 사용이 가능하다.


2.인덱스 힌트

쿼리 내에 힌트 구문들이 많긴 하지만,

사실 쿼리를 작성하면서 주로 쓰는 것이 인덱스 힌트, 파티션 힌트이기에

해당 힌트 2개에 대해서만 소개하려고 한다.

인덱스 힌트의 종류, 설명에 대해서는

해당 블로그 가 더 자세히 설명되어 있다.

어떠한 힌트는 FULL SCAN을 유도하기에 주의가 필요하다.


힌트 구문은 공통적으로 /*+ 힌트 내용 */ 방식으로

주석에서 + 기호가 추가된 형태이다. (“+”가 없으면 일반 주석 처리)

힌트들이 무조건 실행이 되는 것이 아니라, 조건이 만족이 되는 상황에서 실행이 되며

적절한 인덱스 힌트 사용은 쿼리 수행 속도를 향상 시키기에

굳이 인덱스가 생성되어 있는 상황에서 order by를 추가해서

사용하여 더 오래 걸리는 상황이 나오는 것보다 낫다.

SELECT /*+ INDEX(a TABLE_IX1) */ --역순은 INDEX_DESC 사용

a.컬럼1, a.컬럼2

FROM TABLE_NAME1 a;

해당 쿼리는 ORDER BY를 사용하지 않고 정렬이 가능하게 해주며

테이블 내의 인덱스를 사용하여 정렬을 하는 것이기에

SELECT /*+ INDEX(a TABLE_IX1) INDEX_DESC(b TABLE_PK) */ 

a.컬럼1, a.컬럼2, b.컬럼1

FROM TABLE_NAME1 a, TABLE_NAME2 b

WHERE ~ ;

인덱스 힌트는 여러개의 테이블을 조인해서 할 경우에도

여러 개를 부여할 수 있다.

그리고 보통은 테이블 별칭을 사용하는 것을 권장한다.