병합되지 않은 인라인 뷰에서 수행한 그룹핑은 메인 쿼리의 칼럼에 의한 Column Projection이 동작하지 않습니다. 메인 쿼리에서 사용하지 않은 불필요한 표현식을 인라인 뷰에 사용하면 불필요한 Work Area 사용으로 인해 성능이 저하될 수 있습니다.
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.
-- 1
DROP TABLE t1 PURGE;
DROP TABLE t2 PURGE;
CREATE TABLE t1 AS SELECT ROWNUM AS c1, ROWNUM AS c2 FROM XMLTABLE ('1 to 10000');
CREATE TABLE t2 AS SELECT * FROM t1;
아래 쿼리는 병합되지 않은 인라인 뷰에서 그룹핑을 수행하고 메인 쿼리에서 c1 칼럼만 조회합니다. Column Projection Information 항목의 3번에서 c2 칼럼이 projection되지 않은 것을 확인할 수 있습니다. COUNT (c2) 표현식을 제거하는 쿼리 변환이 구현되지 않아 칼럼을 projection하지 못하는 것으로 보입니다.
-- 2
SELECT c1
FROM (SELECT /*+ NO_MERGE */
c1
, COUNT (c2) AS c2
FROM t1
GROUP BY c1);
------------------------------------
| Id | Operation | Name |
------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | VIEW | |
| 2 | HASH GROUP BY | |
| 3 | TABLE ACCESS FULL| T1 |
------------------------------------
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - (rowset=256) "C1"[NUMBER,22]
2 - (rowset=256) "C1"[NUMBER,22], COUNT("C2")[22]
3 - (rowset=256) "C1"[NUMBER,22], "C2"[NUMBER,22]
정렬, UNION ALL 연산자, 해시 조인은 Column Projection 동작하는 것을 확인할 수 있습니다.
-- 3-1
SELECT c1
FROM (SELECT /*+ NO_MERGE */
c1
, c2
FROM t1
ORDER BY c1);
------------------------------------
| Id | Operation | Name |
------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | VIEW | |
| 2 | SORT ORDER BY | |
| 3 | TABLE ACCESS FULL| T1 |
------------------------------------
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - (rowset=256) "C1"[NUMBER,22]
2 - (#keys=1; rowset=256) "C1"[NUMBER,22]
3 - (rowset=256) "C1"[NUMBER,22]
-- 3-2
SELECT c1
FROM (SELECT /*+ NO_MERGE */ c1, c2 FROM t1 UNION ALL
SELECT c1, c2 FROM t2);
------------------------------------
| Id | Operation | Name |
------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | VIEW | |
| 2 | UNION-ALL | |
| 3 | TABLE ACCESS FULL| T1 |
| 4 | TABLE ACCESS FULL| T2 |
------------------------------------
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "C1"[NUMBER,22]
2 - STRDEF[22]
3 - "C1"[NUMBER,22]
4 - "C1"[NUMBER,22]
-- 3-3
SELECT ac1, bc2
FROM (SELECT /*+ NO_MERGE */
a.c1 AS ac1
, a.c2 AS ac2
, b.c2 AS bc2
FROM t1 a, t2 b
WHERE b.c1 = a.c1);
------------------------------------
| Id | Operation | Name |
------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | VIEW | |
|* 2 | HASH JOIN | |
| 3 | TABLE ACCESS FULL| T1 |
| 4 | TABLE ACCESS FULL| T2 |
------------------------------------
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - (rowset=256) "AC1"[NUMBER,22], "BC2"[NUMBER,22]
2 - (#keys=1; rowset=256) "A"."C1"[NUMBER,22], "B"."C2"[NUMBER,22]
3 - (rowset=256) "A"."C1"[NUMBER,22]
4 - (rowset=256) "B"."C1"[NUMBER,22], "B"."C2"[NUMBER,22]