중복 제거에 DISTINCT 키워드와 GROUP BY 절을 사용할 수 있습니다. 성능 측면에서 동일하지만 의미 측면에서 DISTINCT 키워드를 사용하는 편이 바람직합니다.
테스트를 위해 아래의 테이블을 생성하겠습니다.
-- 1
DROP TABLE t1 PURGE;
CREATE TABLE t1 AS SELECT LPAD (MOD (ROWNUM, 100), 100, '0') AS c1 FROM XMLTABLE ('1 to 100000');
아래와 같이 중복 제거에 DISTINCT 키워드와 GROUP BY 절을 사용한 쿼리를 수행하고 SQL ID를 조회하겠습니다.
-- 2-1
SELECT DISTINCT c1 FROM t1;
...
100 행이 선택되었습니다.
-----------------------------------
| Id | Operation | Name |
-----------------------------------
| 0 | SELECT STATEMENT | |
| 1 | HASH UNIQUE | |
| 2 | TABLE ACCESS FULL| T1 |
-----------------------------------
-- 2-2
SELECT prev_sql_id FROM v$session WHERE sid = SYS_CONTEXT ('USERENV', 'SID');
PREV_SQL_ID
-------------
ah870qzjz00kn
1개의 행이 선택되었습니다.
-- 2-3
SELECT c1 FROM t1 GROUP BY c1;
...
100 행이 선택되었습니다.
-----------------------------------
| Id | Operation | Name |
-----------------------------------
| 0 | SELECT STATEMENT | |
| 1 | HASH GROUP BY | |
| 2 | TABLE ACCESS FULL| T1 |
-----------------------------------
-- 2-4
SELECT prev_sql_id FROM v$session WHERE sid = SYS_CONTEXT ('USERENV', 'SID');
PREV_SQL_ID
-------------
4w10q70ynjj1n
1개의 행이 선택되었습니다.
V$SQL_WORKAREA 뷰를 조회하면 DISTINCT 키워드와 GROUP BY 절을 사용한 쿼리의 동작 방식과 workarea 사용량이 같은 것을 확인할 수 있습니다.
-- 3
SELECT sql_id, operation_type, estimated_optimal_size, estimated_onepass_size, last_memory_used, last_execution
FROM v$sql_workarea
WHERE sql_id IN ('ah870qzjz00kn', '4w10q70ynjj1n');
SQL_ID OPERATION_TYPE ESTIMATED_OPTIMAL_SIZE ESTIMATED_ONEPASS_SIZE LAST_MEMORY_USED LAST_EXECUTION
------------- --------------- ---------------------- ---------------------- ---------------- --------------
ah870qzjz00kn GROUP BY (HASH) 868352 868352 1477632 OPTIMAL
4w10q70ynjj1n GROUP BY (HASH) 868352 868352 1478656 OPTIMAL
2 행이 선택되었습니다.