본문 바로가기

ORACLE/Oracle_SQL

DISTINCT, GROUP BY 중복 제거

반응형

## DISTINCT

-  가독성은 높아지지만 temp tablespace에 임시로 저장하고 작업하는 방식이라서 시스템에 부하발생가능성 있음

 

이런식으로 DISTINCT 를 사용할 수 있지만, 첫번째 쿼리는 단지 DEPTNO 중 중복을 제거해주고,

두번째 쿼리는 (DEPTNO, NAME)의 중복을 제거해주기 때문에 모두 출력된다.

 

 

  • DISTINCT의 성능 고려사항:
    • DISTINCT는 데이터 중복을 제거하는 유용한 도구이지만, 대량의 데이터에서 사용할 경우 성능에 영향을 미칠 수 있습니다. DISTINCT는 중복을 제거하기 위해 정렬 작업을 수행하며, 이때 임시 테이블스페이스를 사용해 데이터를 처리하므로 시스템 리소스를 많이 사용할 수 있습니다.
    • 대량의 데이터를 처리할 때, 인덱스를 활용하여 중복 제거를 하는 방법이나 필터링 조건을 통해 쿼리를 최적화하는 것이 더 효율적일 수 있습니다.
  • DISTINCT와 ORDER BY:
    • DISTINCT와 ORDER BY를 함께 사용할 경우, 성능이 더 느려질 수 있습니다. DISTINCT는 중복을 제거하기 위해 데이터를 정렬하는데, 그 후에 ORDER BY로 추가 정렬을 해야 하는 경우가 발생하기 때문입니다.
    • 예시:
    • sql
      Copy code
      SELECT DISTINCT DEPTNO1 FROM STUDENT ORDER BY DEPTNO1;
    • 이런 상황에서는 DISTINCT로 인한 불필요한 정렬을 줄이기 위해 인덱스가 유용할 수 있습니다.
  • DISTINCT와 UNION의 차이:
    • UNION과 DISTINCT는 모두 중복을 제거하는 역할을 하지만, UNION은 두 개 이상의 쿼리 결과를 합친 후 중복을 제거하는 반면, DISTINCT는 단일 쿼리 결과에서만 중복을 제거합니다.
    • UNION ALL은 중복을 제거하지 않기 때문에 더 빠른 성능을 제공할 수 있으며, 특정 상황에서는 UNION 대신 UNION ALL을 사용하는 것이 적합할 수 있습니다.

 

 

SQL> SELECT DISTINCT DEPTNO1
  2  FROM STUDENT;

   DEPTNO1
----------
       101
       103
       202
       301
       201
       102

6 rows selected.

SQL> SELECT DISTINCT DEPTNO1, NAME
  2  FROM STUDENT;

   DEPTNO1 NAME
---------- ----------
       103 이미경
       201 김문호
       201 안은수
       103 허우
       101 김신영
       102 신은경
       102 김진욱
       202 박동호
       201 임세현
       301 노정호
       201 인영민

   DEPTNO1 NAME
---------- ----------
       201 김재수
       102 서재수
       202 오나라
       101 일지매
       201 안광훈
       101 이윤나
       102 김주현
       101 서진수
       301 구유미

20 rows selected.

SQL>

 

 

 

## GROUP BY

- 데이터를 그룹화한 다음 집계 함수를 사용하고자 할 때

 

 

GROUP BY 절에 있는 부분은 모두 SELECT 절에 포함되어야 한다.

→ 모든 절이 포함되지 않으면 ORA-00979 에러 발생

SQL> SELECT DEPTNO1 FROM STUDENT GROUP BY DEPTNO1;

   DEPTNO1
----------
       101
       103
       202
       301
       201
       102

6 rows selected.

 

※ 집계함수는 포함되지 않아도 가능

SQL> SELECT DEPTNO1, COUNT(NAME) FROM STUDENT GROUP BY DEPTNO1;

   DEPTNO1 COUNT(NAME)
---------- -----------
       101           4
       103           2
       202           2
       301           2
       201           6
       102           4

6 rows selected.

SQL>

 

 

 

DISTINCT vs GROUP BY 성능 비교

  1. DISTINCT와 GROUP BY의 차이점:
    • DISTINCT는 단순히 중복된 행을 제거하는 데 사용되며, 전체 쿼리에 대해 중복된 데이터를 필터링합니다.
    • GROUP BY는 데이터를 그룹화하고, 각 그룹에 대해 집계 함수를 적용하는 데 사용됩니다.
    • 성능 비교:
      • 작은 데이터셋에서는 DISTINCT와 GROUP BY의 성능 차이가 크지 않을 수 있지만, 대량의 데이터를 처리할 때는 GROUP BY가 더 성능이 좋을 수 있습니다.
      • 이유는 GROUP BY는 인덱스를 활용할 수 있고, 집계 함수와 함께 사용할 때 최적화가 이루어질 가능성이 크기 때문입니다.
    예시:
    SELECT DEPTNO1 FROM STUDENT GROUP BY DEPTNO1; -- 그룹화 후 중복 제거와 유사한 결과
     
    SELECT DISTINCT DEPTNO1 FROM STUDENT; -- 중복 제거
반응형

'ORACLE > Oracle_SQL' 카테고리의 다른 글

인덱스 관련 쿼리 정리  (0) 2023.07.02
인덱스  (0) 2023.06.26
시스템 권한부여 (ANY)  (0) 2023.06.25
인덱스 생성 속도 향상 (NOLOGGING, PARALLEL)  (0) 2023.06.24
시스템 권한 | WITH GRANT/ADMIN OPTION  (0) 2023.06.09