SET 연산자 기능 개선

2023. 5. 26.·Oracle/SQL

Oracle 21c부터 SET 연산자 뒤에 ALL 또는 DISTICT 키워드를 지정할 수 있습니다. ALL 키워드를 지정하면 중복을 제거하지 않고, DISTICT 키워드를 지정하면 중복을 제거합니다. 기본값은 DISTICT 키워드입니다. 참고로 EXCEPT 연산자는 MINUS 연산자와 동일하게 동작합니다. 결과적으로 INTERSECT ALL 연산자와 MINUS ALL 연산자가 추가되었습니다.

UNION     [ ALL | DISTINCT ]
INTERSECT [ ALL | DISTINCT ]
MINUS     [ ALL | DISTINCT ]
EXCEPT    [ ALL | DISTINCT ]

 

테스트를 위해 아래와 같이 테이블을 생성하겠습니다.

-- 1
DROP TABLE t1 PURGE;
DROP TABLE t2 PURGE;

CREATE TABLE t1 (c1 NUMBER);
CREATE TABLE t2 (c1 NUMBER);

INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (2);
INSERT INTO t1 VALUES (2);
INSERT INTO t1 VALUES (2);

INSERT INTO t2 VALUES (1);
INSERT INTO t2 VALUES (2);
INSERT INTO t2 VALUES (2);
INSERT INTO t2 VALUES (3);
INSERT INTO t2 VALUES (3);

COMMIT;

 

아래 쿼리는 INTERSECT ALL 연산자를 사용합니다. 실행 계획 1번에 INTERSECTION ALL HASH 오퍼레이션이 표시됩니다. 이 오퍼레이션은 소트가 아닌 해시 기반으로 동작합니다.

-- 2-1
SELECT * FROM t1 INTERSECT ALL
SELECT * FROM t2;

C1
--
 1
 2
 2

3 행이 선택되었습니다.

------------------------------------------------------------------
| Id  | Operation             | Name | Starts | A-Rows | Buffers |
------------------------------------------------------------------
|   0 | SELECT STATEMENT      |      |      0 |      0 |       0 |
|   1 |  INTERSECTION ALL HASH|      |      1 |      3 |      14 |
|   2 |   TABLE ACCESS FULL   | T1   |      1 |      6 |       7 |
|   3 |   TABLE ACCESS FULL   | T2   |      1 |      5 |       7 |
------------------------------------------------------------------

-- 2-2
SELECT * FROM t2 INTERSECT ALL
SELECT * FROM t1;

C1
--
 1
 2
 2

3 행이 선택되었습니다.

 

아래 쿼리는 MINUS ALL 연산자를 사용합니다. 실행 계획 1번에 MINUS ALL HASH 오퍼레이션이 표시됩니다. 이 오퍼레이션 역시 소트가 아닌 해시 기반으로 동작합니다.

-- 3-1
SELECT * FROM t1 MINUS ALL
SELECT * FROM t2;

C1
--
 1
 1
 2

3 행이 선택되었습니다.

---------------------------------------------------------------
| Id  | Operation          | Name | Starts | A-Rows | Buffers |
---------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      0 |      0 |       0 |
|   1 |  MINUS ALL HASH    |      |      1 |      3 |      14 |
|   2 |   TABLE ACCESS FULL| T1   |      1 |      6 |       7 |
|   3 |   TABLE ACCESS FULL| T2   |      1 |      5 |       7 |
---------------------------------------------------------------

-- 3-2
SELECT * FROM t2 MINUS ALL
SELECT * FROM t1;

C1
--
 3
 3

2 행이 선택되었습니다.

 

관련 링크

  • SQL Language Reference - Set Operators
  • ORACLE-BASE - SQL Set Operator Enhancements (EXCEPT, EXCEPT ALL, MINUS ALL, INTERSECT ALL) in Oracle Database 21c
저작자표시 비영리 변경금지 (새창열림)
'Oracle/SQL' 카테고리의 다른 글
  • Bitmap-based COUNT (DISTINCT) Functions
  • 분석 함수 기능 개선
  • CHECKSUM 함수
  • MERGE 문의 개별 Insert, Update, Delete 로우 수
정희락
정희락
2007년부터 Oracle Database 성능 최적화에 관심을 가져왔습니다. 현재 한국오라클 Engineered Systems Solution Engineering 팀에서 Solution Engineer로 근무하고 있습니다. 이 블로그는 개인적인 연구 목적으로 운영되며 Oracle 사의 공식적인 입장을 대변하지 않습니다.
  • 정희락
    TunA
    정희락
  • 전체
    오늘
    어제
    • 분류 전체보기 (201)
      • Oracle (173)
        • SQL (33)
        • PLSQL (10)
        • Performance (74)
        • Administration (37)
        • Installation (3)
        • Utilities (1)
        • JSON (8)
        • Vector (7)
      • 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
정희락
SET 연산자 기능 개선
상단으로

티스토리툴바