반응형
저번 시간에 내부 프로시저를 재사용해야 쿼리 수행시 비용이 감소한다고 공부하였다. 그렇게 재사용성을 높이기 위해서 어떻게 해야하는지 알아보자.
바인드 변수 사용
사용자 정의 함수/프로시저, 트리거등은 별도의 이름이 있어 생성하여 계속해서 재사용할 수있다. 하지만 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 |
반응형
'데이터베이스 > 친절한 SQL 튜닝' 카테고리의 다른 글
시퀀셜 액세스와 랜덤 액세스 (0) | 2018.06.28 |
---|---|
데이터 저장 구조 및 I/O 메커니즘 (0) | 2018.06.19 |
오라클 옵티마이저의 소프트파싱(soft parsing)와 하드파싱(hard parsing) (0) | 2018.06.18 |
옵티마이저에게 사용할 인덱스(index) 힌트주기 (0) | 2018.06.18 |
SQL 최적화 과정과 옵티마이저 소개 및 역할안내 (0) | 2018.06.18 |