중복 제거에 대한 DISTINCT 키워드와 GROUP BY 절

2021. 12. 9.·Oracle/Performance

중복 제거에 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 행이 선택되었습니다.
저작자표시 비영리 변경금지 (새창열림)
'Oracle/Performance' 카테고리의 다른 글
  • 병렬 쿼리에서 사용자 정의 함수의 동작 #2
  • 병렬 쿼리에서 사용자 정의 함수의 동작 #1
  • 병렬 SQL 문 조회
  • NL 조인과 INLIST ITERATOR 오퍼레이션
정희락
정희락
2007년부터 Oracle Database 성능 최적화에 관심을 가져왔습니다. 현재 한국오라클 Engineered Systems Solution Engineering 팀에서 Solution Engineer로 근무하고 있습니다. 이 블로그는 개인적인 연구 목적으로 운영되며 Oracle 사의 공식적인 입장을 대변하지 않습니다.
  • 정희락
    TunA
    정희락
  • 전체
    오늘
    어제
    • 분류 전체보기 (201) N
      • Oracle (173) N
        • SQL (33)
        • PLSQL (10)
        • Performance (74)
        • Administration (37)
        • Installation (3)
        • Utilities (1)
        • JSON (8)
        • Vector (7) N
      • Exadata (15)
      • SQL*Plus (2)
      • Linux (5)
      • Resources (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 도서

    • 불친절한 SQL 프로그래밍
    • 불친절한 PL/SQL 프로그래밍
  • 링크

    • Connor McDonald
    • Frits Hoogland
    • Jonathan Lewis
    • Julian Dontcheff
    • Julian Dyke
    • Kun Sun
    • Maria Colgan
    • Martin Bach
    • Mike Dietrich
    • Tanel Poder
  • 공지사항

  • 인기 글

  • 태그

    12c
    19c
    21c
    23ai
    case study
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
정희락
중복 제거에 대한 DISTINCT 키워드와 GROUP BY 절
상단으로

티스토리툴바