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 (..
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) ..
해시 파티션과 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, ..
TBL$OR$IDX$PART$NUM 함수
·
Oracle/Performance
TBL$OR$IDX$PART$NUM 함수는 파티션과 관련된 문서화되지 않은 함수로 파티션과 서브파티션의 포지션 또는 오브젝트 ID를 반환하며, 내부적으로 파티션 Pruning을 위해 사용됩니다. TBL$OR$IDX$PART$NUM 함수의 구문은 아래와 같습니다. 첫 번째 파라미터는 파티션 테이블을 입력합니다. 두 번째 파라미터는 기본적으로 0을 입력하며, 글로벌 파티션 인덱스의 오브젝트 ID를 입력하면 인덱스에 대한 파티션 정보가 반환됩니다. 세 번째 파라미터는 반환 값을 결정합니다. 1은 파티션의 포지션, 0은 서브파티션의 포지션, 4는 파티션의 오브젝트 ID, 3은 서브파티션의 오브젝트 ID를 반환하며, 8을 Deffered Global 인덱스에 대한 파티션 Pruning에 사용하는 것으로 보입니다...
Read Only PDB User
·
Oracle/Administration
Oracle 23c에 PDB 유저를 Read Only로 설정할 수 있는 기능이 추가되었습니다. 테스트를 위해 아래와 같이 u1 유저를 생성하겠습니다.-- 1: SYSDROP USER u1 CASCADE;CREATE USER u1 IDENTIFIED BY u1 DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;GRANT CREATE SESSION to u1; 아래와 같이 Read Only로 설정한 u1 유저에서 DML을 수행하면 ORA-28194 에러가 발생합니다.-- 2-1: U1CREATE TABLE t1 (c1 NUMBER);INSERT INTO t1 VALUES (1);1 개의 행이 만들어졌습니다.-- 2-2: SYSALTER USER u1 READ ONLY;..
LOB 세그먼트명 변경 프로시저
·
Oracle/Administration
Oracle 23c에 LOB 세그먼트명을 변경할 수 있는 기능이 추가되었습니다.To rename an existing LOB segment users perform an operation such as ALTER TABLE ... MOVE, which could perform slowly since the operation physically moves the LOB data as part of the renaming. This enhancement improves the performance of renaming a LOB segment, at the table, partition and subpartition level by eliminating the physical movement of the L..
파티션명 변경 프로시저
·
Oracle/Administration
해시 파티션과 시스템 파티션은 직접 파티션명을 지정하지 않거나 SUBPARTITION TEMPLATE을 정의하지 않으면 파티션명이 자동으로 생성됩니다. 자동으로 생성된 파티션명은 PARTITION 절에서 사용하기에 불편합니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 NUMBER) PARTITION BY HASH (c1) SUBPARTITION BY HASH (c2) SUBPARTITIONS 2 PARTITIONS 2; 해시 파티션과 시스템 파티션은 기본적으로 접두어가 SYS_P인 파티션명으로 생성됩니다. -- 2-1 SELECT partition_name, partition_position ..
SYS_ROW_ETAG 함수
·
Oracle/SQL
Oracle 23c에 SYS_ROW_ETAG 함수가 추가되었습니다. 이 함수는 칼럼 입력 순서와 무관하게 입력 값에 대한 고유한 32바이트 RAW 값을 반환합니다. 결과 값을 사용하면 데이터 변경 여부를 확인할 수 있습니다.SYS_ROW_ETAG (([[schema_name.]table_name.]column_name) [,([[schema_name.]table_name.]column_name)]...) 테스트를 위해 아래와 같이 테이블을 생성하겠습니다.-- 1DROP TABLE t1 PURGE;CREATE TABLE t1 (c1 NUMBER, c2 VARCHAR2(1), c3 VARCHAR2(1), c4 VARCHAR2(1));INSERT INTO t1 VALUES (1, 'A', 'A', 'B');I..
BITOR 함수와 BITXOR 함수
·
Oracle/SQL
Oracle 21c에 BITOR 함수와 BITXOR 함수가 추가되었습니다. 참고로 이 함수들은 문서화되지 않았습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 NUMBER); INSERT INTO t1 VALUES (1, BIN_TO_NUM (0, 0, 1)); INSERT INTO t1 VALUES (2, BIN_TO_NUM (0, 1, 1)); INSERT INTO t1 VALUES (3, BIN_TO_NUM (1, 1, 1)); COMMIT; 아래는 BITOR 함수를 사용한 결과입니다. -- 2 SELECT c1, c2, BITOR (c2, 2) AS bo FROM t1; C1 C2 BO..
에러 메시지 생성 부하
·
Oracle/Performance
2018년 1월 29일 네이버 카페에 작성한 "_suppress_identifiers_on_dupkey 파라미터" 글을 보완한 글입니다. 에러가 대량으로 발생하면 에러 메시지를 생성하기 위한 부가적인 부하로 인해 성능 저하가 발생할 수 있습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 NUMBER); CREATE UNIQUE INDEX t1_u1 ON t1 (c1); 아래 예제는 INSERT 문을 수행하고 DUP_VAL_ON_INDEX 예외가 발생하면 UPDATE 문을 수행하는 방식을 보여줍니다. 이런 방식을 INSERT & UPDATE 방식이라고 합니다. -- 2 SET SERVEROUT ..
Unpivoted V$SQL_SHARED_CURSOR 뷰
·
Oracle/Performance
V$SQL_SHARED_CURSOR 뷰는 특정 자식 커서가 기존 자식 커서와 공유되지 않는 이유를 보여줍니다. 하지만 64개의 여부 속성을 통해 커서를 공유할 수 없는 이유를 파악해야 하므로 편이성이 떨어집니다. 편이성을 높이기 위해 아래와 같이 64개의 여부 속성이 unpivot된 뷰를 생성하겠습니다. SYS.X$KKSCS 테이블은 V$SQL_SHARED_CURSOR 뷰의 베이스 테이블로 bitvector 칼럼에 커서를 공유할 수 없는 이유를 저장합니다. -- 1-1 CREATE OR REPLACE VIEW sys.gu_$sql_shared_cursor AS SELECT inst_id , sql_id , address , child_address , child_number , reason , reaso..