OR Expansion을 사용한 부정형 조건 성능 개선
·
Oracle/Performance
OR Expansion을 사용하면 부정형 조건의 성능을 개선할 수 있습니다. 글을 작성한 후 2018년에 유사한 내용의 글(인덱스와 부정형 조건)을 작성한 사실을 알았습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1, c2, c3) AS SELECT CEIL (ROWNUM / 100000), DECODE (MOD (ROWNUM, 100000), 0, 'N', 'Y'), LPAD ('X', 100, 'X') FROM XMLTABLE ('1 to 1000000'); CREATE INDEX t1_x1 ON t1 (c1, c2); 아래 쿼리는 c2 != 'Y' 조건으로 인해 인덱스 액세스 단계에서 266개의 블록 I/O..
Subquery Pushing과 Execute Call
·
Oracle/Performance
Subquery Pushing으로 동작하는 비상관 단일 행 서브쿼리를 액세스 조건으로 사용하면서브 쿼리가 Execute Call 단계에서 수행됩니다. 이를 통해 쿼리의 성능을 개선한 사례를 살펴보겠습니다. 테스트를 위해 아래와 같이 테이블과 인덱스를 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1, c2, c3) AS SELECT CEIL (ROWNUM / 100000), NVL (NULLIF (MOD (ROWNUM, 100000), 0), 100000), LPAD ('X', 100, 'X') FROM XMLTABLE ('1 to 1000000'); CREATE TABLE t2 (c1, c2, c3) AS SELECT..
SCN_ASCENDING 힌트와 Direct Path Read
·
Oracle/Performance
SCN_ASCENDING 힌트는 문서화되지 않은 힌트로 Bug 6688108 - Enhancement: Allow ORA-1555 to be ignored during table scan (Doc ID 6688108.8) 문서에 아래의 설명이 짧게 포함되어 있습니다. 설명에 따르면 이 힌트를 기술한 쿼리는 Undo 재사용으로 인해 Consistent Read가 불가능한 경우 ORA-1555 에러를 발생시키지 않고 새로운 쿼리(snapshot) SCN으로 블록을 액세스하며, 이로 인해 읽기 일관성을 보장하지 않습니다. ORA-1555 can occur during long running queries involving a ROWID Range or full table scan if the undo has ..
UNUSABLE 인덱스 파티션에 의한 Join Factorization 쿼리 변환
·
Oracle/Performance
UNUSABLE 인덱스 파티션에 의한 Join Factorization 쿼리 변환으로 인해 쿼리의 성능이 저하된 사례를 살펴보겠습니다. 참고로 이 글은 PPWJ 성능 저하 사례와 관련이 있습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. t1은 비파티션 테이블, t2는 파티션 테이블입니다. t1 테이블에는 t2 테이블의 p1, p2 파티션에 해당하는 데이터가 저장되어 있습니다. -- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1, c2) AS SELECT CEIL ((ROWNUM + 600000) / 100000), ROWNUM + 600000 FROM XMLTABLE ('1 to 200000'); CREATE TABLE t2..
ASM Partner Disk 조회
·
Exadata
Exadata에서 1개의 ASM Disk는 8개의 ASM Partner Disk를 가집니다. ASM 인스턴스에서 아래 쿼리를 수행하면 ASM Partner Disk를 조회할 수 있습니다. 1번 셀의 0번 디스크는 2번 셀의 0, 2, 5, 6번 디스크, 3번 셀의 0, 6, 7, 10번 디스크와 파트너링되어 있습니다.-- 1SELECT disk , LISTAGG (partner_disk, ',') WITHIN GROUP (ORDER BY partner_disk) AS partner_disk FROM (SELECT cell || '[' || disk || ']' AS disk , partner_cell || '[' || LISTAGG (partner_di..
Alert 로그 AWK 스크립트
·
Linux
Alert 로그 내용을 Timestamp|Sequence|Message 형태로 변환하는 AWK 스크립트를 작성했습니다. 아래와 같이 log.awk 파일을 생성하겠습니다. #!/usr/bin/awk { if (/^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{6}\+[0-9]{2}:[0-9]{2}$/) { ts = $0; seq = 1; } else if ($0 != "") { printf "%s|%03d|%s\n", ts, seq, $0 seq++; } } 테스트를 위해 아래와 같이 test.log 파일을 생성하겠습니다. 2050-01-01T00:00:01.000000+09:00 A 2050-01-01T00:00:02.000000+09:00 B..
PPWJ(Partial-Partition Wise Join) 성능 저하 개선
·
Oracle/Performance
기준 데이터를 저장한 비파티션 임시 테이블과 실제 데이터를 저장한 파티션 테이블을 병렬 조인하는 경우 임시 테이블의 기준 데이터에 따라 PPWJ(Partial-Partition Wise Join)의 성능이 저하될 수 있습니다. 이 글에서 분배 방식을 변경하여 PPWJ 성능 저하를 개선한 사례를 살펴보겠습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. t1 테이블은 기준 데이터를 저장하는 비파티션 임시 테이블, t2 테이블은 실제 데이터를 저장하는 파티션 테이블입니다.-- 1DROP TABLE t1 PURGE;DROP TABLE t2 PURGE;CREATE GLOBAL TEMPORARY TABLE t1 (c1 NUMBER);CREATE TABLE t2 (c1)PARTITION BY RANGE (..
cell single block physical read 대기 이벤트 세분화
·
Exadata
19.15.0.0.220419, 21.6.0.0.220419 버전부터 cell single block physical read 대기 이벤트가 아래와 같이 세분화되었습니다. 이전 버전의 cell single block physical read 대기 이벤트는 RDMA, xrmem cache, flash cache, hard disk 값을 포함하고 있습니다. 해당 버전부터 HC 스토리지의 경우 cell single block physical read 대기 이벤트는 hard disk에 대한 값만 표시합니다. latency는 RDMA, xrmem cache, flash cache, hard disk 순으로 높습니다. 참고로 Exadata System Software 23.1.0 버전을 지원하는 오라클 데이터베이스..
ALTER TABLE MOVE 개선
·
Oracle/Administration
Oracle 21c의 VLDB and Partitioning Guide에 아래의 설명이 추가되었습니다.As of Oracle Database 21c, you can move partitioned and subpartitioned tables with a single DDL command. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다.-- 1DROP TABLE t1 PURGE;CREATE TABLE t1 (c1 NUMBER, c2 NUMBER)PARTITION BY RANGE (c1)SUBPARTITION BY HASH (c2)SUBPARTITION TEMPLATE ( SUBPARTITION sp1 , SUBPARTITION sp2) ( PARTITION p1 VALUES LESS THA..
Block Range Granules
·
Oracle/Performance
블록 그래뉼(Block Range Granules)의 개수와 크기는 동적으로 결정되지만 아래 파라미터로 그래뉼의 생성 방식을 조정할 수 있습니다. 파라미터에 따르면 블록 그래뉼의 기본 크기는 1GB이며, PX 서버 별로 최소 13개, 최대 100개의 그래뉼이 생성될 수 있습니다. NAME DISPLAY_VALUE DEFAULT_VALUE DESCRIPTION --------------------------- ------------- ------------- ------------------------------------------------------------ _px_granule_size 1000000 1000000 default size of a rowid range granule (in KB) ..
AWK 날짜 값과 숫자 값 포맷팅
·
Linux
AWK 스크립트 작성 시 아래와 같이 날짜 값과 숫자 값을 포맷팅할 수 있습니다. 아래 예제는 systime 함수의 결과를 strftime 함수로 포맷팅합니다. $ echo | awk '{print strftime("%Y-%m-%d %H:%M:%S", systime())}' 2023-01-01 00:00:00 아래 예제는 숫자 값을 포맷팅합니다. \47은 작은따옴표(')를 나타냅니다. $ echo | awk '{printf ("%\47 10.1f\n", "1234567.89")}' 1,234,567.9
해시 파티션과 ORA_HASH 함수
·
Oracle/Administration
해시 파티션은 ORA_HASH 함수와 동일한 해시 알고리즘을 사용합니다. ORA_HASH 함수로 해시 파티션에 대한 skewness를 시뮬레이션할 수 있습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. t1, t2 테이블은 64개의 해시 파티션으로 구성되어 있으며, t1 테이블은 1개, t2 테이블은 2개의 파티션 키로 해시 파티션을 생성합니다. -- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1) PARTITION BY HASH (c1) PARTITIONS 64 AS SELECT ROWNUM FROM XMLTABLE ('1 to 64'); CREATE TABLE t2 (c1, c2) PARTITION BY HASH (c1, ..