프로시저 변수와 상수의 성능 차이 0 2 2,955

by 한재영 [2009.02.03 16:01:27]


문제의쿼리.sql (6,227Bytes)

안녕하세요
오라클 프로시저를 만들면서 아무래도 원인파악이 안되 질문을 드립니다.

프로시저를 만들기 전 상수를 조건문에 대입하여 쿼리를 작성 한 뒤
프로시저 생성 시 상수 부분에 변수로 파라미터를 받아 프로시저를 실행해 보니
동일 쿼리에 성능 차이가 너무 크게 발생을 합니다.

해서 플랜을 확인해 보니 플랜 역시 변동이 있더군요...

테이블은 총 8개를 조인하고 있으며 이중 2, 2, 4개의 테이블을 인라인뷰로 묶어
outer join을 걸고 있습니다.

첨부된 쿼리를 보시면 Line136번 조건이 포함 될 시 변수로 받을 경우 현저히 성능이 떨어 집니다.
상수로 받았을 경우 아무런 문제가 없는데 말이죠...

36시간 째 원인을 모르고 있어 이렇게 문의 드립니다...

by 웅 [2009.02.03 17:10:46]
옵티마이져가 플랜을 세울때 상수처리와 변수처리 시의 다른 플랜을 세울 수 있습니다.
실제 쿼리 내부 컬럼에 대한 값이 Bind 변수의 형태로 들어온다면 실행 시점에서 변수의 값과 Binding 되므로 해당 변수 값에 대한 분포도를 예측할 수 없기 때문입니다.
이것을 방지하기 위해서 Bind_peeking을 하기도 하지만 다른 Side Effect가 있을 수 있습니다.

by 웅 [2009.02.04 09:13:39]
이미 정상적인(원하는?) 실행계획을 알고 있다면 힌트로 유도하는것도 좋은 방법이겠군요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입