Flash Cache Space Usage
·
Exadata
AWR 리포트의 Flash Cache Space Usage 항목은 DBA_HIST_CELL_GLOBAL 테이블의 데이터로 flash cache의 사용량을 비율로 표시합니다. 19.19 버전부터 Default OLTP에 synced dirty data를 표시하는 %Synced 값이 추가되었습니다. 이번 버전까지는 %Unflushed 값에 %Synced 값이 포함되어 있었습니다. 아래 쿼리로 현재 Flash Cache Space Usage 정보를 조회할 수 있습니다. SELECT cell_name , ROUND (space / POWER (1024, 3), 2) AS space -- , ROUND (def_oltp_clean / POWER (1024, 3), 2) AS def_oltp_clean , ROUN..
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..
List of functions by version
·
Resources
V$SQLFN_METADATA 뷰 기준 버전별 함수 목록입니다. 참고로 OPT, SYS_XQ로 시작하는 함수는 표시하지 않습니다. ABS 23.2 21.3 19.3 18.3 12.2 11.2 ACOS 23.2 21.3 19.3 18.3 12.2 11.2 ADD_MONTHS 23.2 21.3 19.3 18.3 12.2 11.2 ADJ_DATE 23.2 21.3 19.3 18.3 12.2 11.2 ANY_VALUE 23.2 21.3 19.3 APPENDCHILDXML 23.2 21.3 19.3 18.3 12.2 11.2 APPROX_COUNT 23.2 21.3 19.3 18.3 APPROX_COUNT_DISTINCT 23.2 21.3 19.3 18.3 12.2 APPROX_COUNT_DISTINCT_AGG ..
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..
CSV to JSON Array
·
Oracle/JSON
Oracle은 아쉽게도 CSV 형식의 문자 값을 JSON Array로 변환하는 기능을 제공하지 않습니다. 아래와 같이 CSV 형식의 문자 값을 JSON Array 형식으로 변환하는 사용자 정의 함수를 생성하겠습니다. -- 1 CREATE OR REPLACE FUNCTION fnc_csv_to_jarray ( i_val IN CLOB , i_del IN VARCHAR2 DEFAULT ',' , i_typ IN VARCHAR2 DEFAULT 'C' -- C, N ) RETURN CLOB -- RETURN JSON IS PRAGMA UDF; TYPE taa_varchar2 IS TABLE OF VARCHAR2(32747) INDEX BY PLS_INTEGER; v_buf VARCHAR2(32767); v_tm..
Parallel Conventional Load
·
Oracle/Performance
병렬 INSERT 문에 NOAPPEND 힌트를 사용하면 데이터를 Conventional Path로 적재할 수 있습니다. 테스트를 위해 아래와 같이 테이블을 생성하고, _optimizer_gather_stats_on_load 파라미터를 FALSE로 설정하겠습니다. -- 1-1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1 NUMBER); CREATE TABLE t2 (c1) AS SELECT ROWNUM FROM XMLTABLE ('1 to 1000000'); -- 1-2 ALTER SESSION SET "_optimizer_gather_stats_on_load" = FALSE; 아래는 병렬 DML이 활성화되지 않은 병렬 INSERT 문의 실..
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); 아..