데이터베이스/친절한 SQL 튜닝

바인드 변수를 이용한 오라클 SQL 튜닝 소개

반응형

저번 시간에 내부 프로시저를 재사용해야 쿼리 수행시 비용이 감소한다고 공부하였다. 그렇게 재사용성을 높이기 위해서 어떻게 해야하는지 알아보자.


바인드 변수 사용

사용자 정의  함수/프로시저, 트리거등은 별도의 이름이 있어 생성하여 계속해서 재사용할 수있다. 하지만 SQL은 이름이 없어서 내부 프로시저에 저장하여 사용한다. 그렇듯 SQL은 별도의 이름이 아닌 그 자체가 이름처럼 고유의 값으로 사용된다.


그럼 공백이나 대,소문자가 달라도 다른 객체인가? 아래 쿼리를보자.


1
2
3
4
5
6
7
8
select * from t where empno = 7695;
select * from t where empno = 7695 ; 
select * from T where empno = 7695;
select * from t WHERE empno = 7695;
select * from scott.emp where empno = 7695;
select /* comment */ * from emp where empno = 7695;
select /*+ first_rows */ * from emp where empno = 7695;
 
cs


위의 쿼리들은 서로 다른 쿼리로서 내부 프로시저에서 공유해서 사용하지 않고 하드파싱이 일어난다. 그렇기에 프로그램에서 과도하게 변경되는 쿼리를 자주사용할 경우 과도한 I/O가 발생하여 리소스를 엄청 소모하게 된다.

이런문제를 해결하기 위해서 쿼리에 바인드 변수를 사용하면 된다.

다음과 같이 쿼리를 변경한다면 한번의 하드파싱이 발생하고 내부적으로 프로시저를 공유하게 되기 때문에 성능이 엄청 빨라진다.


1
select /*+ first_rows */ * from emp where empno = :1;
cs


반응형