안녕하세요~ 자꾸 질문을 올려서 ㅠ 죄송합니다..
매번 궁금한게 생기게 되네여.. 답은 안나오고 ㅠㅠ
SELECT *
FROM (
SELECT DEPARTMENT_ID, DEPARTMENT_NAME, LOCATION_ID FROM DEPARTMENTS
UNION ALL
SELECT DEPARTMENT_ID, DEPARTMENT_NAME, LOCATION_ID FROM DEP
) A , EMPLOYEES B
WHERE A.DEPARTMENT_ID=B.DEPARTMENT_ID
AND A.LOCATION_ID=1700
AND A.DEPARTMENT_NAME='IT'
Execution Plan
----------------------------------------------------------
Plan hash value: 841655364
-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 19 | 2109 | 8 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 10 | 680 | 1 (0)| 00:00:01 |
| 2 | NESTED LOOPS | | 19 | 2109 | 8 (0)| 00:00:01 |
| 3 | VIEW | | 2 | 86 | 6 (0)| 00:00:01 |
| 4 | UNION-ALL | | | | | |
|* 5 | TABLE ACCESS FULL | DEPARTMENTS | 1 | 19 | 3 (0)| 00:00:01 |
|* 6 | TABLE ACCESS FULL | DEP | 1 | 43 | 3 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | EMP_DEPARTMENT_IX | 10 | | 0 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - filter("DEPARTMENT_NAME"='IT' AND "LOCATION_ID"=1700)
6 - filter("LOCATION_ID"=1700 AND "DEPARTMENT_NAME"='IT')
7 - access("A"."DEPARTMENT_ID"="B"."DEPARTMENT_ID")
테스트한거 긁어온건데 줄간격이 좀 삐뚫어지네요. 죄송합니다.
위 실행계획에서 VIEW가 생성이 됐습니다. 병합불가능 인라인뷰로 동작 된거 같습니다.
근데 필터조건이 VIEW 안쪽에 들어가 있네요... 이거 쿼리 변환으로 주 쿼리 WHERE 조건이
인라인 뷰안으로 삽입 된거 아닌가요?
읽고 있는 책에 따르면 주쿼리 조건이 들어간 것이면... VIEW PUSH PREDICATE 가 생성되야 할거 같은데
VIEW 가 생성이 됐네요.
==> 내용이 번잡한거 같아서.. 정확한 질문은
1. FILTER 처리가 먼저 되고 VIEW가 생성이 된게 맞는것인지.
2. 만약 그렇다면, VIEW안으로 주쿼리 조건이 삽입 된게 맞는것인지, 주쿼리 조건이 인라인 뷰안으로 삽입될때 실행계획이 VIEW PUSH PREDICATE가 아니고 VIEW로 나올수 있는 것인지.
3. 주쿼리 조건이 삽입이 안되도록 강제적으로 해볼수 없는지.
이 세가지입니다.
매번 정말 감사합니다. 정말 정말 감사합니다.
1. FILTER 처리가 먼저 되고 VIEW가 생성이 된게 맞는것인지.
==> 네. 맞습니다.
2. 만약 그렇다면, VIEW안으로 주쿼리 조건이 삽입 된게 맞는것인지, 주쿼리 조건이 인라인 뷰안으로 삽입될때 실행계획이 VIEW PUSH PREDICATE가 아니고 VIEW로 나올수 있는 것인지.
==> PUSH PREDICATE 는 상수 조건이 아닌 NL조인 테이블의 컬럼 조건이 삽입될 때 나타나는 것입니다.
3. 주쿼리 조건이 삽입이 안되도록 강제적으로 해볼수 없는지.
==> 조인조건이 삽입되는 경우는 no_push_pred 힌트로 제어합니다.
조인 조건의 경우엔 조건 삽입 여부에 따라 성능이 달라질 수 있습니다.
그러나, 조인 조건이 아닌 상수 조건의 삽입인 경우엔 항상 성능이 향상되기 때문에 별도 힌트 없습니다.
http://wiki.gurubee.net/pages/viewpage.action?pageId=26742311