MULTI-TABLE INSERT 문의 동작 방식
·
Oracle/Performance
MULTI-TABLE INSERT 문은 APPEND 힌트와 PARALLEL 힌트의 사용에 따라 동작 방식이 달라질 수 있습니다. 테스트를 위해 아래와 같이 테이블을 생성하고, ALTER SESSION 문으로 병렬 DML을 활성화하겠습니다. -- 1-1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; DROP TABLE t3 PURGE; CREATE TABLE t1 AS SELECT ROWNUM AS c1 FROM XMLTABLE ('1 to 10000'); CREATE TABLE t2 (c1 NUMBER); CREATE TABLE t3 (c1 NUMBER); -- 1-2 ALTER SESSION ENABLE PARALLEL DML; 아래 INSERT 문은 t1 테이블을 읽어 t..
사용자 정의 함수에 대한 실행 계획
·
Oracle/Performance
사용자 정의 함수는 사용 위치에 따라 실행 계획에 Rowsource 실행 통계가 표시될 수도 있고 표시되지 않을 수도 있습니다. 테스트를 위해 아래와 같이 t1 테이블과 f1 함수를 생성하겠습니다. -- 1-1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1) AS SELECT ROWNUM FROM XMLTABLE ('1 to 10000'); -- 1-2 CREATE OR REPLACE FUNCTION f1 (i_v1 IN NUMBER) RETURN NUMBER IS v1 NUMBER; BEGIN SELECT COUNT (*) INTO v1 FROM t1; RETURN v1; END; / 아래 2-2번, 2-4번 쿼리는 실행 계획에 함수의 Rowsource 실행 통계가 표시되고,..
DESCENDING 인덱스
·
Oracle/Administration
DESCENDING 인덱스는 일부 인덱스 칼럼이 내림차순으로 정렬된 인덱스로 오름차순과 내림차순이 혼재된 정렬을 처리하기 위한 용도로 사용됩니다. 테스트를 위해 아래와 같이 테이블과 인덱스를 생성하겠습니다. t1_x1 인덱스는 c2 칼럼이 내림차순으로 정렬된 DESCENDING 인덱스입니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 AS SELECT CEIL (ROWNUM / 2) AS c1, ROWNUM AS c2 FROM XMLTABLE ('1 to 10'); CREATE INDEX t1_x1 ON t1 (c1, c2 DESC); DESCENDING 인덱스는 FBI로 생성됩니다. SYS_NC00003$ 칼럼은 t1 테이블에 암시적으로 생성된 Virtual 칼럼입니다...
Right Growing Index 경합 해소
·
Oracle/Performance
Right Growing Index(이후 RGI)는 enq: TX - index contention 대기가 발생할 수 있으며, RAC인 경우 gc buffer busy 대기가 함께 발생할 수 있습니다. 아래 t1_x1 인덱스는 인덱스 키 칼럼이 TIMESTAMP 값으로 전형적인 RGI입니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 ( ts TIMESTAMP , val VARCHAR2(4000) ) PARTITION BY RANGE (ts) ( PARTITION p205001 VALUES LESS THAN (TIMESTAMP '2050-02-01 00:00:00') , PARTITION p205002 VALUES LESS THAN (TIMESTAMP '2050-03-01..
칼럼 조회에 따른 MERGE 문의 성능 차이
·
Oracle/Performance
예전에 조건 기술에 따른 MERGE 문의 성능 차이라는 글을 썼습니다. MERGE 문은 조회한 칼럼에 따라서도 성능의 차이가 발생할 수 있습니다. 구체적으로는 MERGE 문이 해시 조인되는 경우 INTO 절과 USING 절에 필요한 칼럼만 조회함으로써 성능을 개선할 수 있습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다.-- 1DROP TABLE t1 PURGE;DROP TABLE t2 PURGE;CREATE TABLE t1 AS SELECT ROWNUM AS c1, 1 AS c2, LPAD ('X', 4000, 'X') AS c3 FROM XMLTABLE ('1 to 10000');CREATE TABLE t2 AS SELECT ROWNUM AS c1, 1 AS c2, LPAD ('X', 400..
rowsource 통계 수집 부하
·
Oracle/Performance
rowsource 통계를 수집하면 추가적인 부하가 발생할 수 있습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 AS SELECT ROWNUM AS c1, 1 AS c2 FROM XMLTABLE ('1 to 10000000'); CREATE INDEX t1_x1 ON t1 (c1); 아래와 같이 쿼리를 수행하겠습니다. rowsource 통계를 수집하지 않은 2-1번 쿼리는 6.15초, GATHER_PLAN_STATISTICS 힌트로 rowsource 통계를 수집한 2-2번 쿼리는 6.69초, STATISTICS_LEVEL 파라미터로 rowsource 통계를 수집한 2-3번 쿼리는 8.49초가 소요됩니다. -- 2-1 S..
Oracle Exadata Data Sheet
·
Resources
Oracle Exadata X11MOracle Exadata Database Machine X11M Data SheetOracle Exadata Storage Expansion X11M Data Sheet Oracle Exadata X10MOracle Exadata Database Machine X10M Data SheetOracle Exadata Storage Expansion X10M Data Sheet Oracle Exadata X9MOracle Exadata Database Machine X9M-2 Data SheetOracle Exadata Database Machine X9M-8 Data SheetOracle Exadata Storage Expansion X9M-2 Data Sheet Orac..
Oracle White Paper
·
Resources
[2024-03] Exadata Performance and AWR (public)[2023-01] Oracle SecureFiles (public)[2022-04] Oracle Hybrid Columnar Compression (public)[2021-05] Oracle Database 19c Oracle Autonomous Health Framework[2021-03] Oracle Real Application Clusters (RAC) Cache Fusion Performance Optimizations on Exadata (public)[2021-01] Oracle Advanced Compression (public)[2020-08] Continuous Availability - Applicati..
무한소수의 집계 순서에 따른 결과 값
·
Oracle/SQL
무한소수는 집계 순서에 따라 결과 값이 달라질 수 있습니다. 이로 인해 데이터 마이그레이션 이후 데이터 조회 순서가 달라져 쿼리의 결과 값이 달라질 수 있습니다. 테스트를 위해 아래의 테이블을 생성하겠습니다.-- 1DROP TABLE t1 PURGE;CREATE TABLE t1 AS SELECT ROWNUM * 100 AS c1 FROM XMLTABLE ('1 to 12'); 아래 쿼리의 c2 열은 c1 칼럼을 12로 나눠 일부 값이 무한소수로 반환됩니다.-- 2SELECT c1, c1 / 12 AS c2 FROM t1; C1 C2---- ---------- 100 8.33333333 -- ! 200 16.6666667 -- ! 300 25 400 33.3333333 -- ..
ORA-14196 에러
·
Oracle/Administration
UNIQUE 인덱스의 일부 선두 칼럼으로 PK 제약 조건을 생성하면 ORA-14196 에러가 발생합니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. c1 칼럼을 NOT NULL로 정의했습니다.-- 1DROP TABLE t1 PURGE;CREATE TABLE t1 (c1 NOT NULL, c2, c3) AS SELECT ROWNUM, ROWNUM, LPAD ('X', 100, 'X') FROM XMLTABLE ('1 to 10000000'); 아래와 같이 NOT NULL로 정의된 UNIQUE 인덱스의 칼럼으로 PK 제약 조건을 생성하면 PK 제약 조건 생성에 0.01초가 소요됩니다.-- 2CREATE UNIQUE INDEX t1_pk ON t1 (c1);ALTER TABLE t1 ADD CONST..
FOR UPDATE SKIP LOCKED 절 사용 방법
·
Oracle/SQL
FOR UPDATE SKIP LOCKED 절은 주로 다중 소비자 큐(multi-consumer queue)을 구현하기 위해 사용됩니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. 선착순으로 쿠폰을 발생하는 업무를 가정하여 c1 칼럼은 쿠폰번호, c2 칼럼은 발생여부 값을 저장합니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 AS SELECT ROWNUM AS c1, 'N' AS c2 FROM XMLTABLE ('1 to 10'); CREATE INDEX t1_x1 ON t1 (c2, c1); 1번 세션에서 아래 쿼리를 실행하면 c1이 1인 행에 락이 설정됩니다. -- 2: S1 SELECT * FROM t1 WHERE c1 >= 1 AND c2 = 'N' AND..
가상 칼럼을 사용한 리스트 파티션
·
Oracle/Administration
MOD 함수나 ORA_HASH 함수를 사용한 가상 칼럼을 파티션 키로 사용하면 해시 파티션과 유사한 리스트 파티션을 생성할 수 있습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. ORA_HASH (c1, 3) 표현식으로 c2 가상 칼럼을 생성하고, c2 칼럼을 파티션 키로 가진 4개의 리스트 파티션을 생성합니다. 데이터 타입이 문자 타입이라면 MOD 함수 대신 ORA_HASH 함수를 사용할 수 있습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 ( c1 NUMBER , c2 NUMBER AS (MOD (c1, 4)) --, c2 NUMBER AS (ORA_HASH (c1, 3)) ) PARTITION BY LIST (c2) ( PARTITION p0 VALUE..