09 Static vs. Dynamic SQL

하드 파싱 부하를 최소화하기 위해 Dynamic SQL 대신 Static SQL을 사용하라는 표현을 흔히 사용하는데,
일반적으로 Static SQL이란 바인드 변수를 사용한 SQL문이고, Dynamic SQL이란 바인드 변수를 사용하지 않은 SQL문이라고 알고 있다.

(1) Static SQL

  • Static SQL이란 String형 변수에 담지 않고 코드 사이에 직접 기술한 SQL문을 말한다. 다른 말로 'Embedded SQL' 이라고도 한다.

(2) Dynamic SQL

  • Dynamic SQL이란 String형 변수에 담아서 기술하는 SQL문을 말한다 String 변수를 사용하므로 조건에 따라 SQL문을 동적으로 바꿀 수 있고,
    또는 런타임 시에 사용자로 부터 SQL문의 일부 또는 전부를 입력 받아서 실행할 수도 있다. 따라서 PreCompile 시 Syntax, Semantics 체크가 불가능하다.

문제의 본질은 바인드 변수 사용 여부


Static, Dynamic SQL은 애플리케이션 개발 측면에서의 구분일 뿐이며, 데이터베이스 입장에서는 차이가 없다.
Static SQL를 사용하든 Dynamic SQL를 사용하든 오라클 입장에서는 던져진 SQL문 그 자체만 인식할 뿐이며,
애플리케이션 커서 캐싱 기능을 사용하지 않는다면 Dynamic, Static 구분은 라이브러리 캐시 효율과도 전혀 무관하다.
그러므로 라이브러리 캐시 효율을 논할 때 초점은 바인드 변수 사용 여부에 맞춰져야 한다.
Dynamic SQL을 사용해 문제가 되는 것이 아니라 바인드 변수를 사용하지 않았을 때 문제가 되는 것이다.
바인드 변수를 사용하지 않고 Literal 값을 SQL 문자열에 결합하는 방식으로 개발했을 때, 반복적인 하드파싱으로 성능이 얼마나 저하되는지,
그리고 그 때문에 라이브러리 캐시에 얼마나 심한 경합이 발생하는지, 바인드 변수 사용여부로 Static과 Dynamic을 구분하는 것은
잘못된 것이므로 용어 사용에 주의하자.