Parallel 힌트와 JPPD 쿼리 변환
·
Oracle/Performance
Oracle 12c의 버그 Fix으로 인해 구문 수준의 PARALLEL 힌트를 사용한 병렬 쿼리의 경우 JPPD에 대한 실행 계획이 변경될 수 있습니다. 테스트를 위해 아래와 같이 테이블과 인덱스를 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1, c2) AS SELECT ROWNUM, LPAD ('X', 100, 'X') FROM XMLTABLE ('1 to 100'); CREATE TABLE t2 (c1, c2) AS SELECT CEIL (ROWNUM / 100), LPAD ('X', 100, 'X') FROM XMLTABLE ('1 to 10000'); CREATE INDEX t2_x1 ON t2 (c1); 아..
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..
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 오퍼레이..
Hash-based Set Operation
·
Oracle/Performance
개요Oracle 21c에 Hash-based Set Operation 기능이 추가되었습니다. 이 기능은 UNION, INTERSECT, MINUS 연산을 해시 방식으로 수행함으로써 성능을 개선합니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다.-- 1DROP TABLE t1 PURGE;DROP TABLE t2 PURGE;CREATE TABLE t1 (c1, c2) AS SELECT ROWNUM, LPAD ('X', 100, 'X') FROM XMLTABLE ('1 to 10000');CREATE TABLE t2 (c1, c2) AS SELECT ROWNUM + 5000, LPAD ('X', 100, 'X') FROM XMLTABLE ('1 to 10000'); UNION 연산자아래는 19.3 버전..
Hash Rollup
·
Oracle/Performance
Oracle 21c에 Hash Rollup 기능이 추가되었습니다. 이 기능은 ROLLUP에 대해 해시 방식의 집계를 사용으로써 성능을 개선합니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다.-- 1DROP TABLE t1 PURGE;CREATE TABLE t1 (c1, c2) AS SELECT CEIL (ROWNUM / 10000), LPAD ('X', 100, 'X') FROM XMLTABLE ('1 to 10000000'); 아래는 19.3 버전에서 ROLLUP을 사용한 쿼리의 실행 계획입니다. 수행에 2.51초가 소요되고, 실행 계획 2번에 SORT GROUP BY ROLLUP 오퍼레이션이 표시됩니다.-- 2: 19.3SELECT c1, COUNT (*) FROM t1 GROUP BY ROL..
SQL Analysis Report
·
Oracle/Performance
Oracle 사의 Product Manager인 Nigel Bayliss가 포스팅한 New SQL Analysis Report in Oracle Database 23c Free! 글에서 Oracle 23c에 SQL Analysis Report 기능이 추가된 것을 알 수 있습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다.-- 1DROP TABLE t1 PURGE;CREATE TABLE t1 (c1, c2) AS SELECT ROWNUM, LPAD ('X', 100, 'X') FROM XMLTABLE ('1 to 10000');CREATE INDEX t1_x1 ON t1 (c1); 아래 쿼리는 조인 조건이 없어 cartesian product이 발생합니다. 실행 계획 하단에 조인 조건을 추가하나 ..
V$MYSTAT 뷰
·
Oracle/Performance
아래는 Database Reference의 V$MYSTAT 뷰에 대한 내용입니다. 참고로 병렬 쿼리는 현재 세션이 QC 역할을 담당하고, 별도의 세션의 PX 서버가 작업을 수행합니다. 병렬 쿼리의 성능 분석에 V$MYSTAT 뷰를 활용하려면 PX 서버의 통계 값이 V$MYSTAT 뷰의 통계 값에 포함되어야 합니다. 결론부터 말하면 V$MYSTAT 뷰와 V$SESSTAT 뷰의 통계 값은 PX 서버의 통계 값을 포함합니다. 참고로 V$SESSION_EVENT 뷰의 대기 이벤트 정보는 PX 서버의 대기 이벤트 정보를 포함하지 않습니다. V$MYSTAT contains statistics on the current session. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE ..
WITH 절에 대한 FPD 쿼리 변환 (WCFPD)
·
Oracle/Performance
Oracle 21c에 WITH 절에 대한 FPD(Filter PushDown) 쿼리 변환 기능이 추가되었습니다. 이 기능은 SELECT 문에 사용한 조건을 WITH 절에 Pushdown함으로써 성능을 개선합니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다.-- 1DROP TABLE t1 PURGE;CREATE TABLE t1 (c1, c2) AS SELECT ROWNUM, LPAD ('X', 100, 'X') FROM XMLTABLE ('1 to 1000000'); 아래는 19.3 버전에서 WITH 문을 사용한 쿼리의 실행 계획입니다. t1 테이블 전체를 임시 영역에 저장한 것을 확인할 수 있습니다.-- 3: 19.3WITH w1 AS (SELECT /*+ MATERIALIZE */ * FROM ..
Lock-Free Reservation #2
·
Oracle/Performance
개요지난 글에 이어 2,000개의 세션에서 1,000개의 티켓을 예약하는 시나리오를 가정하고 Lock-Free Reservation, Pessimistic Locking, FOR UPDATE SKIP LOCKED 방식의 성능을 측정해보겠습니다. 참고로 Oracle 23c Free는 2 코어만 지원하므로 향후 추가 테스트가 필요할 것으로 보입니다. Lock-Free ReservationLock-Free Reservation 방식을 테스트를 위해 아래와 같이 테이블을 생성하겠습니다.-- 1ALTER TABLE t1 MODIFY (c2 NOT RESERVABLE);DROP TABLE t1 PURGE;DROP TABLE t2 PURGE;CREATE TABLE t1 ( c1 NUMBER , c2 NUMBE..