SET 연산자 기능 개선
·
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 PUR..
CHECKSUM 함수
·
Oracle/SQL
Oracle 21c에 CHECKSUM 함수가 추가되었습니다. CHECKSUM 함수는 집계한 칼럼 값에 대한 체크섬을 반환하며, 로우 셋의 특정 칼럼에 대한 변경 여부를 확인하는 목적으로 사용할 수 있습니다. CHECKSUM ([ DISTINCT | ALL ] expr) [OVER (analytic_clause)] 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 NUMBER, c3 VARCHAR2(1)); INSERT INTO t1 VALUES (1, 1, 'A'); INSERT INTO t1 VALUES (2, 1, 'B'); INSERT INTO t1 VALUES (3, 1, 'C'); INSERT..
ANY_VALUE 함수
·
Oracle/Performance
Oracle 19c에 ANY_VALUE 함수가 추가되었습니다. ANY_VALUE 함수는 집계 함수로 그룹에서 널이 아닌 첫 번째 값을 반환합니다. 이 함수는 첫 번째 값을 찾은 후 집계를 수행하지 않아 결과가 비결정적이고, MIN, MAX 함수보다 속도가 빠른 것으로 알려져 있습니다. ANY_VALUE ([ DISTINCT | ALL ] expr) 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1, c2) AS SELECT CEIL (ROWNUM / 1000000), CEIL (ROWNUM / 1000000) FROM XMLTABLE ('1 to 10000000'); 아래 쿼리는 수행에 0.65초가 소요됩니다. -- 2 ..
INSERT ALL 문에 대한 변경 정보
·
Oracle/Performance
INSERT ALL 문은 대상 테이블에 삽입한 전체 로우 수가 *_TAB_MODIFICATIONS 뷰의 변경 정보로 저장됩니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1 NUMBER); CREATE TABLE t2 (c1 NUMBER); 아래 INSERT ALL 문은 t1, t2 테이블에 각각 100 로우를 삽입합니다. 이어서 ROLLBACK 문을 수행하겠습니다. -- 2 INSERT ALL INTO t1 INTO t2 SELECT ROWNUM AS c1 FROM XMLTABLE ('1 to 100'); 200 행이 생성되었습니다. ROLLBACK; *_TAB_MODIFICA..
MERGE 문의 개별 Insert, Update, Delete 로우 수
·
Oracle/SQL
*_TAB_MODIFICATIONS 뷰의 변경 정보로 MERGE 문의 개별 Insert, Update, Delete 로우 수를 계산할 수 있습니다. 다만 지난 글의 세션 통계와 달리 변경 정보는 시스템 수준에서 저장되므로 이 방법은 ETL처럼 단독으로 수행되는 MERGE 문에만 사용할 수 있습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1, c2) AS SELECT ROWNUM, 1 FROM XMLTABLE ('1 to 200'); CREATE TABLE t2 (c1, c2) AS SELECT ROWNUM, CEIL (ROWNUM / 100) FROM XMLTABLE ('1 ..
ORA_HASH 함수
·
Oracle/SQL
19c까지 ORA_HASH 함수는 CLOB 값에 대해 무작위 해시 값을 반환합니다. 아래는 SQL Language Reference의 ORA_HASH 함수에 대한 내용입니다. 원칙적으로 ORA_HASH 함수는 LOB 타입을 사용할 수 없습니다. The expr argument determines the data for which you want Oracle Database to compute a hash value. There are no restrictions on the length of data represented by expr, which commonly resolves to a column name. The expr cannot be a LONG or LOB type. It cannot be ..
CLOB 값을 바이트 단위로 자르기
·
Oracle/SQL
Oracle Database는 CLOB 값을 바이트 단위로 자르는 기능을 제공하지 않습니다. CLOB 값을 바이트 단위로 자르려면 조금 복잡한 표현식을 사용해야 합니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다.-- 1DROP TABLE t1 PURGE;CREATE TABLE T1 (c1 CLOB);INSERT INTO t1 VALUES ('가나다라마바사아자차카타파하');COMMIT; SUBSTRB 함수는 CLOB 타입을 지원하지 않습니다. SUBSTR 함수와 DBMS_LOB.SUBSTR 함수는 글자 단위로 CLOB 값을 자르며, SUBSTR 함수는 CLOB 타입, DBMS_LOB.SUBSTR 함수는 VARCHAR2 타입을 반환합니다.-- 2-1SELECT SUBSTRB (c1, 1, 10) A..
MERGE 문의 개별 Insert, Update 로우 수
·
Oracle/SQL
Oracle Database는 MERGE 문의 개별 Insert, Update 로우 수를 제공하지 않습니다. 패키지 변수로 MERGE 문의 개별 Insert, Update 로우 수를 계산할 수 있지만 성능 저하가 발생할 수 있습니다. 아래 세션 통계를 사용하면 성능 저하없이 MERGE 문의 개별 Insert, Update 로우 수를 계산할 수 있습니다. 참고로 MERGE 문의 Update과 Delete는 Row 단위, Insert는 Array 단위로 처리됩니다. 통계 내용 HSC Heap Segment Block Changes 힙 세그먼트의 블록을 변경하기 위해 액세스한 로우 수 (Array 처리는 1 증가) Heap Segment Array Inserts 힙 세그먼트에 대한 Array Insert 횟수..
Precheckable Constraints using JSON SCHEMA
·
Oracle/Administration
Oracle 23c에 Precheckable Constraints using JSON SCHEMA 기능(이후 Precheck 제약 조건)이 추가되었습니다. Precheck 제약 조건의 JSON 값을 사용하면 애플리케이션에서 값을 사전 검증할 수 있습니다.Supported check constraints can be checked outside the database. For this, you mark the check constraint as PRECHECK. For example, you can create a JSON Schema document from a table or column with precheckable check constraint. This means that data could b..
INSERT 문의 수행 방식에 따른 Redo와 Undo의 생성량
·
Oracle/Performance
INSERT 문은 수행 방식에 따라 Redo와 Undo의 생성량이 달라질 수 있습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다.-- 1DROP TABLE t1 PURGE;DROP TABLE t2 PURGE;DROP TABLE t3 PURGE;CREATE TABLE t1 (c1 NUMBER, c2 VARCHAR2(100));CREATE TABLE t2 (c1 NUMBER, c2 VARCHAR2(100));CREATE TABLE t3 (c1 NUMBER, c2 VARCHAR2(100)); 아래와 같이 세 가지 방식으로 INSERT 문을 수행하겠습니다. 2-1번을 Single-row Insert, 2-2번을 Multi-row Insert, 3-3번을 Bulk Insert 방식이라고 부르겠습니다.--..
executeBatch 메소드로 수행한 DML 문의 수행 횟수
·
Oracle/Performance
FORALL 문으로 수행한 DML 문의 수행 횟수처럼 executeBatch 메소드로 수행한 DML 문의 수행 횟수도 executeBatch 메소드의 수행 횟수로 기록됩니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1 NUMBER); 아래 내용으로 BatchInsertTest.java 파일을 생성하겠습니다. import java.sql.*; public class BatchInsertTest { public static void main(String[] args) { String url = "jdbc:oracle:thin:@//192.168.0.10:1519/ORA19C"; String user = "tuna"; ..
Hash-based Distinct Aggregation
·
Oracle/Performance
Oracle 21c에 Hash-based Distinct Aggregation 기능이 추가되었습니다. 이 기능은 COUNT (DISTINCT) 표현식을 2번 이상 사용한 쿼리에 대해 해시 방식의 집계를 사용으로써 성능을 개선합니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1, c2) AS SELECT CEIL (ROWNUM / 1000), CEIL (ROWNUM / 1000) FROM XMLTABLE ('1 to 10000000'); 아래는 19.3 버전에서 COUNT (DISTINCT) 표현식을 2번 사용한 쿼리의 실행 계획입니다. 수행에 4.85초가 소요되고, 실행 계획 2번에 SORT GROUP BY 오퍼레이..