PL/SQL 오브젝트 컴파일 시 ORA-29275 에러 발생
·
Oracle/PLSQL
아래 함수는 오타로 인해 컴파일 경고가 발생합니다. SHOW ERROR 명령어를 수행하면 "ORA-29275: 부분 다중 바이트 문자" 에러 메시지가 출력되고 에러가 발생한 라인이 표시되지 않습니다. -- 1-1 CREATE OR REPLACE FUNCTION f1 (i_v1 IN NUMBER) RETURN VARCHAR2 IS BEGIN RETURN CASE WHEN i_v1 =< 10 THEN 'A' END; -- ! END; / 경고: 컴파일 오류와 함께 함수가 생성되었습니다. -- 1-2 SHOW ERROR ERROR: ORA-29275: 부분 다중 바이트 문자 오류가 없음. 오타를 수정한 후 함수를 컴파일하면 에러가 발생하지 않습니다. 단순한 오타로 인해 발생한 컴파일 경고지만 불명확한 에러 메..
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..
파티션 MERGE 동작 방식
·
Oracle/Administration
파티션 MERGE 동작 방식을 테스트하기 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 NUMBER) PARTITION BY RANGE (c1) ( PARTITION p1 VALUES LESS THAN (2) , PARTITION p2 VALUES LESS THAN (MAXVALUE) ); 아래 실행 계획에서 파티션 merge가 p1 파티션을 읽어 p2 파티션으로 입력하는 방식으로 동작하는 것을 알 수 있습니다. 단일 세그먼트는 단일 테이블스페이스에 존재해야 하므로 상이한 테이블스페이스에 생성된 파티션의 경우 예상되는 동작 방식이지만, 동일한 테이블스페이스에 생성된 파티션이라면 메타데이터 변경만으로 파티션을..
다중 키 해시 파티션
·
Oracle/Performance
다중 키로 생성한 해시 파티션의 조회 방식을 테스트하기 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 NUMBER, c3 NUMBER) PARTITION BY HASH (c1, c2, c3) PARTITIONS 256; 전체 파티션 키를 등호(=)로 입력하면 단일 파티션이 조회됩니다. -- 2 SELECT * FROM t1 WHERE c1 = 1 AND c2 = 1 AND c3 = 1; ------------------------------------------------------ | Id | Operation | Name | Pstart| Pstop | ----------------------------..
병렬 MERGE 문의 데이터 분배
·
Oracle/Performance
병렬 MERGE 문은 아래의 두 가지 데이터 분배 방식을 사용합니다. 12.0.1.2 이상 버전은 타깃 테이블이 비파티션 테이블인 경우 PX SEND (ROWID RANDOM) 분배 방식을 사용하고, 타깃 테이블이 파티션 테이블인 경우 PX SEND HYBRID (ROWID PKEY) 분배 방식을 사용합니다. 타깃 테이블이 파티션 테이블인 경우 삽입되는 데이터에 따라 데이터 분배가 불균형할 수 있습니다. PX SEND (ROWID RANDOM) 분배 방식: UPDATE는 ROWID 범위, INSERT는 RANDOM 방식으로 분배 PX SEND HYBRID (ROWID PKEY) 분배 방식: UPDATE는 ROWID 범위, INSERT는 PK 범위로 분배 테스트를 위해 아래와 같이 t1, t2, t3 테이..
max_idle_blocker_time 파라미터
·
Oracle/Administration
Oracle 19c에 max_idle_blocker_time 파라미터가 추가되었습니다. 블로킹 세션이 이 파라미터에 지정한 시간동안 IDLE 상태로 유지되면 세션을 자동으로 종료됩니다. 기본값은 0으로 미사용입니다. 블로킹 세션으로 인해 성능 이슈가 발생하고 있다면 해당 파라미터의 적용을 고려할 수 있습니다.-- 1SELECT name, value, default_value, description FROM v$parameter WHERE name = 'max_idle_blocker_time';NAME VALUE DEFAULT_VALUE DESCRIPTION--------------------- ----- ------------- ------------------------..
ORA-01779 에러
·
Oracle/SQL
Oracle 21c부터 Updatable Join View에 대한 ORA-01779 에러가 사라진 것으로 보입니다. 참고로 이 에러와 관련된 BYPASS_UJVC 힌트는 11.1 버전에서 deprecate되었습니다.Starting with Oracle Database Release 21c, it is not mandatory for all updatable columns in a join view to map to columns of a key-preserved table. When updating a join view, ensure that the UPDATE operation is deterministic. Note that this does not cause any impact on update p..
Varray 타입 칼럼 테이블 구조
·
Oracle/Administration
Varray 타입 칼럼은 내부적으로 VARCAR2 타입이나 CLOB 타입에 데이터를 저장합니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE OR REPLACE TYPE tva_number FORCE IS VARRAY(32767) OF NUMBER; / CREATE TABLE t1 (c1 NUMBER, c2 tva_number); INSERT INTO t1 VALUES (1, tva_number (1, 2)); COMMIT; 아래는 t1 테이블을 조회하는 쿼리의 실행 계획입니다. -- 2 SELECT * FROM t1; ----------------------------------------------------- | Id | Operat..
Nested Table 타입 칼럼 테이블 구조
·
Oracle/Administration
Nested Table 타입 칼럼을 가진 테이블을 생성하면 암시적으로 Nested Table과 Nested Table 인덱스가 생성됩니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 CREATE OR REPLACE TYPE tnt_number FORCE IS TABLE OF NUMBER; / DROP TABLE t1 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 tnt_number) NESTED TABLE c2 STORE AS t1_c2; INSERT INTO t1 VALUES (1, tnt_number (1, 2)); COMMIT; 아래는 t1 테이블을 조회하는 쿼리의 실행 계획입니다. 스칼라 서브쿼리와 유사한 형태로 SYS_FK0000084463N00002$ 인..
JSON_EACH 함수
·
Oracle/JSON
개요 PostgreSQL의 JSON_EACH 함수는 key-value로 구성된 JSON 오브젝트를 로우 형식으로 반환합니다. Oracle Database는 JSON_EACH 함수를 제공하지 않아 PL/SQL 함수를 통해 JSON_EACH 함수 기능을 구현해야 합니다. PostgreSQL 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE IF EXISTS t1; CREATE TABLE t1 (c1 JSON); INSERT INTO t1 VALUES ('{"A":1,"B":2}'); COMMIT; JSON_EACH 함수는 아래와 같이 동작합니다. -- 2 SELECT b.key, b.value FROM t1 a, JSON_EACH (a.c1) b; key | value ----..
Unnest JSON Array
·
Oracle/JSON
개요 PostgreSQL의 UNNEST 함수는 배열 값을 로우 형식으로 반환합니다. 다수의 배열 값을 입력하면 같은 위치의 배열 값이 하나의 로우로 반환됩니다. Oracle Database는 JSON 배열과 PL/SQL 함수로 유사한 기능을 구현할 수 있습니다. PostgreSQL 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE IF EXISTS t1; CREATE TABLE t1 (c1 INTEGER[], c2 TEXT[]); INSERT INTO t1 VALUES ('{1,2,3}', '{"A","B"}'); -- INSERT INTO t1 VALUES (ARRAY[1,2,3], ARRAY['A','B']); COMMIT; UNNEST 함수는 아래와 같이 동작합니다. ..
자동 통계 수집과 STALE_PERCENT
·
Oracle/Performance
자동 통계 수집은 STALE_PERCENT 설정과 관련이 있습니다. 테스트를 위해 아래와 같이 100개의 로우를 가진 t1 테이블을 생성하고, DBMS_STATS.GATHER_TABLE_STATS 프로시저로 t1 테이블의 통계를 수집하겠습니다. -- 1-1 DROP TABLE t1 PURGE; CREATE TABLE t1 AS SELECT ROWNUM AS c1 FROM XMLTABLE ('1 to 100'); -- 1-2 EXEC DBMS_STATS.GATHER_TABLE_STATS ('TUNA', 'T1') PL/SQL 처리가 정상적으로 완료되었습니다. DBMS_STATS.GET_PREFS 함수로 통계의 기본 설정(preferences)을 조회할 수 있습니다. 아래 쿼리는 t1 테이블의 STALE_P..