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..
NL 조인의 결과 순서
·
Oracle/Performance
NL 조인은 기본적으로 아우터의 순서로 결과를 반환하지만, NLJ_BATCHING 방식으로 동작하는 NL 조인은 물리 I/O가 발생할 경우 아우터의 순서로 결과를 반환하지 않을 수 있습니다. 아울러 NL 조인의 이너에서 테이블을 액세스하지 않아도 아우터의 순서로 결과를 반환하지 않을 수 있습니다. 테스트를 위해 아래와 같이 테이블과 인덱스를 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1, c2) AS SELECT ROWNUM, ROWNUM FROM XMLTABLE ('1 to 10000'); CREATE TABLE t2 (c1, c2) AS SELECT ROWNUM, ROWNUM FROM XMLTABLE ('1 to..
SP2-0309: SQL*Plus 명령어는 최대 20 까지의 깊이로만 내포될 수 있습니다.
·
SQL*Plus
SQL*Plus에서 SQL 파일의 호출은 최대 20번까지만 내포될 수 있습니다. 테스트를 위해 아래와 같이 rc.sql 파일을 작성하겠습니다. 마지막 줄에서 rc.sql 파일을 재귀 호출합니다.-- rc.sqlSET FEEDBACK OFFSET SERVEROUTPUT ONBEGIN DBMS_OUTPUT.PUT_LINE (:b_repeats); :b_repeats := :b_repeats + 1;END;/@rc -- recursirve call 아래와 같이 b_repeats 바인드 변수를 선언하고 rc.sql 파일을 실행하면 20번의 재귀 호출 후에 SP2-0309 에러가 발생하는 것을 확인할 수 있습니다.SQL> VAR b_repeats NUMBER = 1SQL> @rc123456789..
SQL 문 반복 수행 스크립트
·
Linux
개요 SQL 문을 반복 수행하는 쉘 스크립트를 두 가지 방식으로 작성해보겠습니다. 첫 번째 방식 아래 스크립트는 정해진 횟수만큼 SQL 문을 반복 수행합니다. SQL 문을 수행할 때마다 DB에 접속하는 방식입니다. $ cat loop1.sh #!/bin/bash iteration=${1:-86400} sleep=${2:-1} for ((i=1; i
조인 칼럼의 low_value와 high_value에 의한 조인 카디널리티
·
Oracle/Performance
조인 칼럼의 low_value와 high_value는 조인 카디널리티 계산에 영향을 줍니다. 조인 칼럼의 high_value가 다른 조인 칼럼의 low_value와 값이 겹치지 않으면 조인 카디널리티가 1로 계산되어 비효율적인 실행 계획이 생성될 수 있습니다. 테스트를 위해 아래와 같이 t1, t2 테이블을 생성하겠습니다. 두 테이블 모두 2021-01-01부터 2022-12-31까지 데이터가 존재하고 2021-12-31 이후 통계를 수집하지 않았다고 가정합니다. -- 1-1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 AS SELECT ROWNUM AS c1 , DATE '2020-12-31' + CEIL (ROWNUM / 100) AS c2 ..
low_value와 high_value를 벗어난 값에 대한 예상 카디널리티
·
Oracle/Performance
통계 수집을 중단한 후 특정 기간이 경과하면 low_value와 high_value를 벗어난 값의 예상 카디널리티가 선형적으로 감소하기 때문에 비효율적인 실행계획이 수립될 수 있습니다. 테스트를 위해 아래와 같이 t1 테이블을 생성하겠습니다. 통계 수집시 히스토그램을 생성하지 않았습니다. -- 1-1 DROP TABLE t1 PURGE; CREATE TABLE t1 AS SELECT ROWNUM AS c1 , DATE '2020-12-31' + CEIL (ROWNUM / 100) AS c2 FROM XMLTABLE ('1 to 36500'); -- 1-2 EXEC DBMS_STATS.GATHER_TABLE_STATS (ownname => 'TUNA', tabname => 'T1', method_opt =..
OR 조인 조건을 사용한 아우터 조인의 성능 저하 #1
·
Oracle/Performance
19c에서 INSERT 문이나 CTAS 문에 OR 조인 조건이 있는 아우터 조인을 사용하면 비효율적인 실행 계획으로 인해 성능이 저하될 수 있습니다. 테스트를 위해 아래의 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; DROP TABLE t3 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 NUMBER, c3 NUMBER); CREATE TABLE t2 (c1 NUMBER, c2 NUMBER, c3 NUMBER); CREATE TABLE t3 (c1 NUMBER, c2 NUMBER); 아래 쿼리는 OR 조인 조건을 사용했지만 b.c1 = a.c1 조건으로 해시 조인으로 아우터 조인을 수행합니다. OR 조인 조건인 a.c2 ..
ExaWatcher Charts
·
Exadata
ExaWatcher는 엑사데이터 시스템의 스토리지 서버 및 데이터베이스 서버에서 성능 데이터를 수집하는 유틸리티입니다. GetExaWatcherResults.sh 쉘 스크립트로 ExaWatcher에서 수집한 데이터를 추출할 수 있습니다. $ cd /opt/oracle.ExaWatcher $ sh GetExaWatcherResults.sh -h [INFO ] "--help" option detected, GetExaWatcherResults will display the help information. All the other command line inputs will be ignored. GetExaWatcherResults.sh is a convenient script to collect a spec..
Historical SQL Monitor Report
·
Oracle/Performance
12.1 버전부터 SQL Monitor Report 데이터가 AWR에 저장됩니다. 아래와 같이 DBMS_AUTO_REPORT.REPORT_REPOSITORY_DETAIL 함수로 Historical SQL Monitor Report를 생성할 수 있습니다. rid에 리포트 ID, type에 TEXT 또는 ACTIVE를 입력합니다. -- 1 SELECT DBMS_AUTO_REPORT.REPORT_REPOSITORY_DETAIL (rid => :v_rid, type => 'TEXT') AS report FROM DUAL; 아래 쿼리로 Historical SQL Monitor Report의 리포트 ID를 조회할 수 있습니다. DBA_HIST_REPORTS는 AWR로 캡처된 XML 보고서에 대한 정보를 표시합니다...
히든 파라미터 조회 뷰
·
Oracle/Administration
히든 파라미터 조회 뷰를 생성해보겠습니다. 보안상의 이유로 이 뷰는 운영 환경이 아닌 테스트 환경에서만 사용해야 합니다. 아래 쿼리로 기본이 되는 GV$PARAMETER 뷰와 GV$PARAMETER_VALID_VALUES 뷰의 소스를 조회할 수 있습니다.-- 1SELECT view_name, view_definition FROM v$fixed_view_definition WHERE view_name IN ('GV$PARAMETER', 'GV$PARAMETER_VALID_VALUES');VIEW_NAME VIEW_DEFINITION------------------------- --------------------------------------------------------..