쿼리와 뷰의 plan 이 달라요... 0 3 1,685

by 연규호 [Oracle Tuning] plan view [2013.07.10 18:03:41]



오라클 쿼리 그대로 뷰를 만들었는데 쿼리와 뷰의 PLAN이 달라요.

쿼리는 A 칼럼 INDEX를 RANGE SCAN 하지만 뷰는 FULL SCAN 합니다.

A 칼럼에 INDEX 가 있습니다. 원인이 뭘까요? 아래는 실제 쿼리는 아니구요.. 간단한 예제입니다.

VIEW :

CREATE OR REPLACE FORCE VIEW V_1( A, B, C, D )

AS

SELECT A, B, C , SUM(D)

FROM TABLE_1

GROUP BY A, B, C

==> 뷰를 SELECT * FROM V_1 WHERE A = '20130101' 한 경우 PLAN 시 TABLE_1을 FULL SCAN

QUERY :

SELECT A, B, C , SUM(D)

FROM TABLE_1

WHERE A = '20130101'

GROUP BY A, B, C

==> 쿼리를 PLAN 뜨면 TABLE_1의 INDEX를 RANGE SCAN

by 마농 [2013.07.10 18:23:41]

SELECT * FROM V_1 WHERE A = '20130101'
이 쿼리를 그대로 변형하면 이렇게 됩니다.
인라인 뷰 형태로 조건절이 밖에 있게 되죠.
SELECT * FROM
(
SELECT A, B, C , SUM(D)
FROM TABLE_1
GROUP BY A, B, C
)
WHERE A = '20130101'
;
즉, 제시하신 쿼리와는 다르죠.
물론, 내부적으로 쿼리변환(조건절 삽입 및 뷰머징) 과정을 거치게 되면
제시하신 쿼리와 동일해 지긴 하겠네요.


간단하게 줄이신 안되는게 이상한 정상적인 쿼리 말구요...
실제 돌리신 쿼리를 보고싶네요.


by 연규호 [2013.07.11 10:49:21]

우선 댓글 감사합니다.

쿼리와 쿼리를 테이블형태로 싸고 만든 뷰의 PLAN 이 동일하지 않다는 것은 알겠습니다만
개발 환경 상 쿼리를 바로 쓸수 없습니다.

꼭 VIEW 칼럼에  WHERE 조건 부분을 추가해서 VIEW를 조회하는 플랫폼으로 되어있습니다.

실제 복잡한 쿼리를 다 보여드리긴 어렵고 위와 같이 간단한 쿼리의 상태에서
칼럼 A (날짜)를 필히 사용해야하는 상황에서 좀 더 속도가 나은 방법은 없을까요?

by 마농 [2013.07.11 10:54:42]
위 간단 예제만 보면 전혀 문제가 없습니다.
쿼리 변환과정을 거쳐서 원하는대로 동작하게 됩니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입