동적 쿼리와 만능 쿼리

우리가 일반적으로 사용하는 쿼리는 정적 쿼리다. 정적 쿼리는 조건들이 고정돼 있으며 실행계획도 고정돼 있으므로 문제 발생시 조치와 대응이 쉽다. 동적 쿼리는 조건 자체가 가변적이기 때문에 적절한 튜닝으로 대응하기가 힘들다.

동적 쿼리는 애플리케이션 소스상 사용할 조건들을 가변적으로 구성하는 쿼리를 말한다. 이러한 동적 쿼리는 애플리케이션상에서 자주 쓰이고 있다.

/* 동적 쿼리 */
SELECT *
FROM 고객정보
WHERE 1=1
IF ? THEN ( AND 고객아이디 = ? ) END IF
IF ? THEN ( AND 주민등록번호 = ? ) END IF
IF ? THEN ( AND 사업자번호 = ? ) END IF
...
/* 만능 쿼리 */
SELECT *
FROM 고객정보
WHERE 고객아이디 LIKE ?
AND 주민등록번호 LIKE ?
AND 사업자번호 LIKE ?
...

동적 쿼리는 하나의 쿼리가 아니고 조건에 따라 여러개의 쿼리로 나뉘고, 오라클 옵티마이저는 그 모든 쿼리에 대해 실행계획을 제공하지만 성능을 보장하지 못한다.

만능 쿼리의 경우는 조건절이 가변적이지 않지만 옵티마이저에게는 하나의 쿼리로 인식되고 하나의 실행계획만 제공하지만 경우에 따라 동적쿼리와 같은 쿼리로 구분될 수 있다는 것을 알 수 있다.

핵심 조건절의 수만큼 쿼리를 분리해야한다.

개발자는 왜 만능쿼리, 동적쿼리로 작성하는 것일까?

  • 개발 일정이 촉박해 최소한의 개발 시간을 보장 받지 못하기 때문이다.
  • 애플리케이션 소스코드가 간단해 그 유혹에서 벗어나기 쉽지 않다.
  • 고객이 원하는 모든 요구사항을 한 번에 해결하고자 하는 개발자의 강박감이 있기 때문이다.

이를 개선하려면 최대한 쿼리를 분리해야한다. 특히 만능 쿼리는 해결 방법이 없다. 사용하지 않는 것이 답이다.

한방 쿼리

프로그래머는 절차적이고 구조적인 사고를 가져야 한다. DBA는 집합적 사고를 가져야한다. 쿼리를 작성해 한 방에 원하는 결과를 추출하는 집합적 사고력이 필요하다.