Direct Load 기능 개선
·
Oracle/Performance
Oracle 23c부터 Direct Load 후 커밋을 수행하지 않더라도 동일 세션에서 쿼리 또는 DML 문을 수행할 수 있도록 Direct Load 기능이 개선되었습니다. 참고로 New Features Guide에 Direct Load 후 다른 세션에서 DML 문을 수행할 수 있다는 내용이 있습니다.Prior to this feature, after a direct load and prior to a commit, queries and additional DMLs were not allowed on the same table for the same session or for other database sessions. This enhancement allows the loading session to ..
UNION ALL에 대한 Pushing Group By
·
Oracle/Performance
Oracle 23c에 UNION ALL 연산자를 포함한 인라인 뷰에 GROUP BY 절을 Pushing하는 쿼리 변환이 추가되었습니다. 참고로 이 기능은 New Features Guide에 포함되어 있지 않습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다.-- 1DROP TABLE t1 PURGE;DROP TABLE t2 PURGE;CREATE TABLE t1 (c1, c2) AS SELECT CEIL (ROWNUM / 100), 1 FROM XMLTABLE ('1 to 1000000');CREATE TABLE t2 (c1, c2) AS SELECT * FROM t1; 아래는 19.3 버전의 실행 계획입니다. UNION ALL 연산을 수행한 후 집계를 수행합니다.-- 2: 19.3SELECT ..
UPDATE 문 SET 절 서브쿼리 Unnesting
·
Oracle/Performance
Oracle 21c에 UPDATE 문의 SET 절에 사용한 서브쿼리가 Unnesting되는 쿼리 변환이 추가되었습니다. 참고로 이 기능은 New Features Guide에 포함되어 있지 않습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; DROP TABLE t3 PURGE; CREATE TABLE t1 (c1, c2, c3, c4) AS SELECT ROWNUM, ROWNUM, ROWNUM, ROWNUM FROM XMLTABLE ('1 to 1000000'); CREATE TABLE t2 (c1, c2) AS SELECT c1, c2 FROM t1; CREATE TABLE t3 (c1, c2) AS SELEC..
Automatic SQL Transpiler
·
Oracle/Performance
Oracle 23c에 Automatic SQL Transpiler 기능이 추가되었습니다. 해당 기능은 단순 표현식을 반환하는 PL/SQL 함수를 SQL 표현식으로 변환해 SQL과 PL/SQL 간의 Context switching을 제거함으로써 성능을 개선합니다.PL/SQL functions within SQL statements are automatically converted (transpiled) into SQL expressions whenever possible. Transpiling PL/SQL functions into SQL statements can speed up overall execution time. 테스트를 위해 아래와 같이 테이블과 함수를 생성하겠습니다. f1 함수는 단순 표현식..
서브쿼리 팩토링 절과 log file sync 이벤트
·
Oracle/Performance
서브쿼리 팩토링 절(WITH 절)이 materialize되면 redo가 발생하고 이로 인해 log file sync 이벤트 대기가 발생할 수 있습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1) AS SELECT ROWNUM FROM XMLTABLE ('1 to 10000000'); 아래 쿼리는 서브쿼리 팩토링 절이 materialize되었습니다. 실행 계획 2번에 LOAD AS SELECT (CURSOR DURATION MEMORY) 오퍼레이션이 표시됩니다. 물리 I/O가 발생하지 않았으므로 12.2 버전에 추가된 In-Memory CDT 기능이 동작한 것을 유추할 수 있습니다. -- 2 WITH w1 AS (..
V$SQL 뷰의 program_id, program_line# 칼럼
·
Oracle/Performance
V$SQL 뷰의 program_id 칼럼은 SQL 문이 포함된 PL/SQL 오브젝트의 오브젝트 ID, program_line# 칼럼은 PL/SQL 오브젝트에서 SQL 문이 위치한 라인 번호를 표시합니다. SQL 문이 포함된 PL/SQL 오브젝트를 식별할 수 있는 유용한 정보지만 PL/SQL 오브젝트가 재생성되는 경우 부정확한 정보가 표시될 수 있습니다. 테스트를 위해 아래와 같이 p1 프로시저를 생성하고 프로시저를 실행하겠습니다. -- 1-1 CREATE OR REPLACE PROCEDURE p1 IS v1 NUMBER; BEGIN SELECT /*+ TEST */ 1 INTO v1 FROM DUAL; END; / -- 1-2 EXEC p1; 아래와 같이 V$SQL 뷰의 program_id 값으로 SQL..
SQL*Net more data from client 이벤트와 SDU 설정
·
Oracle/Performance
SQL*Net more data from client 이벤트는 클라이언트로부터 데이터 수신을 대기할 때 발생합니다. 주로 바인드 변수 값의 크기가 큰 INSERT 문에서 발생하지만, 구문의 크기가 큰 쿼리에서도 발생할 수 있습니다.The server is waiting on the client to send more data to its client shadow process, in an already initiated operation. 아래는 구문의 크기에 따라 SQL*Net more data from client 이벤트가 발생하는 횟수를 테스트한 결과입니다. 첫 번째는 8 KB 단위로 데이터를 전송하고 그 이후부터는 32 KB 단위로 데이터를 전송한다는 것을 유추할 수 있습니다.-- 1+------..
FORALL 문으로 수행한 DML 문의 수행 횟수
·
Oracle/Performance
FORALL 문으로 수행한 DML 문의 수행 횟수는 FORALL 문의 수행 횟수로 기록됩니다. 이로 인해 SQL 실행 통계 분석 시 주의가 필요합니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. t1 테이블은 1,000,000개의 로우를 가지고 있습니다. -- 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 1000000'); CREATE TABLE t2 AS SELECT * FROM t1 WHERE 0 = 1; 아래와 같이 1,000건 단위로 Bulk Insert를 수행하겠습니다. FORALL 문은 1,000회(=..
예상 카디널리티에 따른 SORT CLUSTER BY ROWID 오퍼레이션의 동작
·
Oracle/Performance
SORT CLUSTER BY ROWID 오퍼레이션은 예상 카디널리티에 따라 정렬 크기가 달라질 수 있으며, 이로 인해 Buffer pinning 효과가 달라질 수 있습니다. 부정확한 오브젝트 통계로 인해 SORT CLUSTER BY ROWID 오퍼레이션의 정렬 크기가 감소하여 Buffer pinning 효과가 감소하는 경우 통계 정보를 수집하거나 DYNAMIC_SAMPLING 힌트를 사용하여 성능을 개선할 수 있습니다. 테스트를 위해 아래와 같이 t1 테이블과 CF가 나쁜 t1_x1 인덱스를 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1, c2) AS SELECT NVL (NULLIF (MOD (ROWNUM, 100), 0), 100) , LPAD ('..
반복 표현식 성능 개선
·
Oracle/Performance
12c에 반복 표현식에 대한 성능 개선 기능이 추가된 것으로 보입니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1) AS SELECT DATE '2050-01-01' FROM XMLTABLE ('1 to 1000000'); 아래 쿼리는 TO_CHAR (c1, 'MM') 표현식을 12번 반복하여 사용합니다. 11.2 버전에서 수행에 1.56초가 소요됩니다. -- 2: 11.2 SELECT SUM (DECODE (TO_CHAR (c1, 'MM'), '01', 1)) AS c01 , SUM (DECODE (TO_CHAR (c1, 'MM'), '02', 1)) AS c02 , SUM (DECODE (TO_CHAR (c1,..
Historical SQL Monitor Report가 저장되지 않는 이슈
·
Oracle/Performance
Historical SQL Monitor Report는 _report_capture_cycle_time 파라미터와 관련이 있습니다. 이 파라미터를 0으로 설정하면 리포트가 저장되지 않습니다. 12.1 버전의 MMON 관련 이슈로 인해 이후 버전에서도 파라미터를 0으로 설정하도록 권고하는 경우가 많은 것으로 보입니다. NAME VALUE DEFAULT_VALUE ISSYS_MODIFIABLE DESCRIPTION -------------------------- ----- ------------- ---------------- --------------------------------------------------------- _report_capture_cycle_time 60 60 IMMEDIATE T..
OR 조인 조건을 사용한 아우터 조인의 성능 저하 #2
·
Oracle/Performance
개요 OR 조인 조건이 있는 아우터 조인은 비효율적인 실행 계획으로 인해 성능이 저하될 수 있습니다. OR 조인 조건이 아닌 다른 조인 조건이 있는 경우 OR 조인 조건을 CASE 표현식으로 변경하여 성능을 개선할 수 있습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 NUMBER, c3 NUMBER, c4 NUMBER); CREATE TABLE t2 (c1 NUMBER, c2 NUMBER); 직렬 쿼리 아래 쿼리는 OR 조인 조건을 처리하기 위해 t2 테이블을 Lateral View로 변환하고 소트 머지 조인으로 아우터 조인을 수행합니다. 하지만 Pred..