상황: 회원 ID만 바꾸어 동일한 주문 목록 조회 SQL을 반복 실행한다.
BAD SQL
-- 애플리케이션에서 요청마다 SQL 문자열을 새로 생성
SELECT o.ord_no
,o.ord_dtm
FROM tr_ord_big o
WHERE o.mbr_id = 'M00019';
SELECT o.ord_no
,o.ord_dtm
FROM tr_ord_big o
WHERE o.mbr_id = 'M05338';
SQL
복사
•
조회 조건의 값만 다른데도 매 요청마다 SQL 문자열을 새로 생성한다.
•
실행할 SQL 문장과 입력값을 분리하지 않고 문자열에 값을 직접 결합하는 방식이다.
GOOD SQL
PREPARE member_orders AS
SELECT o.ord_no
,o.ord_dtm
FROM tr_ord_big o
WHERE o.mbr_id = $1;
EXECUTE member_orders('M00019');
EXECUTE member_orders('M05338');
-- 실습 종료 시
DEALLOCATE member_orders;
SQL
복사
•
$1을 이용해 SQL 문장과 조회할 값을 분리한다.
•
한 번 준비한 동일한 SQL에 서로 다른 회원 ID를 전달해 실행한다.
핵심
•
애플리케이션에서 조건값을 SQL 문자열에 직접 이어 붙이지 말고 바인드 변수를 사용하자.
•
SQL 문장은 유지하고 입력값만 파라미터로 전달하는 습관을 갖자.
참고
•
PostgreSQL은 실행 조건에 따라 custom plan 또는 generic plan을 선택할 수 있다. 바인드 변수를 사용한다고 항상 더 빠르거나 동일한 실행계획이 나오는 것은 아니다.
•
이 예제의 핵심은 실행계획 개선 실측이 아니라 안전하고 일관된 SQL 작성 방식이다. 원문에 BAD/GOOD 실측 실행계획이 없어 별도로 기재하지 않았다.


