실행/파싱고급Oracle 전용
Bind Variable (바인드 변수)
SQL의 값 부분을 변수로 분리해 실행계획을 재사용
정의
WHERE id = :1처럼 값을 변수로 분리한 SQL. 같은 SQL 텍스트가 여러 값으로 반복 실행되어도 옵티마이저는 한 번만 Hard Parse하고 이후엔 Soft Parse로 캐시된 실행계획을 재사용한다. 보안 측면에서도 SQL Injection을 원천 차단한다. 단, 값 분포가 매우 편향된 컬럼에서는 Bind Variable Peeking으로 인해 잘못된 계획이 캐싱될 수 있다.
왜 중요한가?
OLTP에서 가장 중요한 성능 패턴. 애플리케이션 ORM이 PreparedStatement를 쓰면 자동으로 Bind Variable을 사용한다. 동적 SQL을 문자열 결합으로 만들면 매번 다른 SQL이 되어 Hard Parse 폭증.
틀리기 쉬운 포인트
- !Bind Variable Peeking: 첫 실행 값에 최적화된 계획이 다른 값에는 비효율일 수 있습니다.
- !문자열 결합으로 동적 SQL을 만들면 Bind Variable 효과가 사라집니다.
- !PreparedStatement가 Bind Variable을 자동으로 사용합니다.
예시
-- 권장 SELECT * FROM employees WHERE id = :emp_id; -- 비권장 (리터럴 결합) -- SELECT * FROM employees WHERE id = 100; -- SELECT * FROM employees WHERE id = 101;
성능 포인트
!Bind Variable Peeking 부작용: 첫 실행 값에 최적화된 계획이 다른 값에는 비효율. Adaptive Cursor Sharing(11g+)으로 일부 보완.