With문 관련! 0 3 9,403

by 장우람 [2009.11.24 18:08:30]


with문을 쓰면 쿼리가 빨라지나요??

우선은 시간이 오래 걸리는 쿼리가 from 절에 두세개 들어가 있구요

이 쿼리를 돌리니 시간이 너무 오래 걸리더라구요..

원래 전 with를 쿼리 간결하게 하기 위해 종종 썼거든요..

그런데 위처럼 있는 쿼리를 with로 묶어 실행해보니 무지 빨라지더라구요..

제가 알기론 with문은 쿼리를 단지 간결하게 하기위해 쓰는 것으로 알고 있는데..

아닌가요?

윗단에서 with문 한번만 실행하고 그걸 실제 쿼리에서 가져다 쓰는식? 이런것인가요?

흠.. 궁굼하네요..

만약 후자라면.. 오라클에서 쿼리 실행계획을 세울때 어찌 세우는 건지 좀 알려주세요~~

무지 궁굼하네요^^;

by feelie [2009.11.24 20:01:02]
서브쿼리 팩토링(WITH)
1. with절을 사용하여 쿼리의 결과를 임시테이블에 저장합니다.
2. 개념적으로 인라인뷰와 동일합니다.
3. 한번 복잡한 가공을 한 결과를 하나의 쿼리에서 여러번 사용가능하므로 복잡한 결과를 여러분 사용할 경우 아주 좋습니다.
인라인뷰인 경우는 사용된 횟수만큼 계속 쿼리를 수행합니다. 하지만
서브쿼리 팩토링은 쿼리의 변형이 불가능합니다.

with절 실행으로 임시테이블이 생성되고, 임시테이블의 명칭은 오라클이 자동생성합니다.
그러면 2개의 테이블을 조인하는 실행계획과 거의 유사합니다.
단 내부적으로 임시 테이블이 만들어지는 부분만 추가됩니다.

by 장우람 [2009.11.25 09:13:09]
후.. 그랬었군요..
with문을 실행하여 먼저 임시테이블을 만든다..
실제쿼리에서는 쿼리가 아닌 임시테이블을 사용한다..

설명 감사합니다^^V

by 강정식 [2009.11.25 10:34:40]
feelie님이 서브쿼리 팩토링에 대해 잘 알려주셨는데요.
약간 수정될 내용이 있어 추가해 드립니다.

with절을 사용하게 되면 temp table을 만든다라는 것은 맞지만 항상 그런것은 아닙니다. 즉 temp table 처럼 사용하게 하려면 with절에 /*+ MATERIALIZE */ 힌트를 명시하여야만 하며 이 힌트를 명시하지 않을 경우 temp table을 안만들고 view merging이 될 수도 있습니다.

http://wiki.gurubee.net/pages/viewpage.action?pageId=3899396#9.%EC%BF%BC%EB%A6%AC%EB%B3%80%ED%99%98-3.%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81

위의 링크에 해당 내용을 정리한 부분이 있으니 참고해 보시기 바랍니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입