NL 조인의 비용 계산
·
Oracle/Performance
이번 글에서 NL 조인의 비용 계산에 대해 살펴본 후 optimizer_index_caching, optimizer_index_cost_adj 파라미터가 NL 조인 비용 계산에 미치는 영향에 대해 살펴보겠습니다. 준비테스트를 위해 아래와 같이 테이블과 인덱스를 생성하겠습니다.-- 1DROP TABLE t1 PURGE;DROP TABLE t2 PURGE;CREATE TABLE t1 (c1) AS SELECT ROWNUM FROM XMLTABLE ('1 to 10000');CREATE TABLE t2 (c1, c2, c3) ASSELECT ROWNUM, CEIL (ROWNUM / 100), NVL (NULLIF (MOD (ROWNUM, 100), 0), 100) FROM XMLTABLE ('1 to 1000..
MBRC 설정에 따른 multiblock read 동작
·
Oracle/Performance
개요 db_file_multiblock_read_count  파라미터는 multiblock read 수행 시 한 번의 I/O 작업에서 읽을 수 있는 최대 블록 수를 지정합니다. 기본값은 플랫폼이 효율적으로 수행할 수 있는 최대  I/O 크기(대부분의 플랫폼은 1MB)를 블록 크기(db_block_size = 8K)로 나눈 값인 128로 설정됩니다. 10.2 이전 버전은 multiblock read의 수행과 비용 계산에 모두 db_file_multiblock_read_count  파라미터를 사용했지만 10.2 버전부터 multiblock read의 수행은 _db_file_exec_read_count 파라미터, 시스템 통계(MBRC)가 수집되지 않은 경우 multiblock read의 비용 계산은 _db_..
_optimizer_nested_loop_join 힌트
·
Oracle/Performance
Oracle 21c에 _optimizer_nested_loop_join 힌트가 추가되었습니다. 이 글에서 _optimizer_nested_loop_join 힌트의 동작에 대해 살펴보겠습니다.NAME TYPE VALUE DEFAULT_VALUE ISSES_MODIFIABLE DESCRIPTION--------------------------- ---- ----- ------------- ---------------- ------------------------------_optimizer_nested_loop_join 2 on on TRUE favor/unfavor nested loop joinNAME ..
ROWNUM을 사용하는 FETCH FIRST 변환
·
Oracle/Performance
Oracle 23ai(23.4)부터 ROW LIMITING 절을 사용한 쿼리가 분석 함수가 아닌 ROWNUM 슈도 칼럼을 사용하는 쿼리로 변환됩니다. 아래는 쿼리 변환과 관련된 Fix Control입니다.-- 1SELECT bugno, value, sql_feature, description, optimizer_feature_enable FROM v$system_fix_control WHERE bugno = 35915968; BUGNO VALUE SQL_FEATURE DESCRIPTION OPTIMIZER_FEATURE_ENABLE-------- ----- ----------------------------- ---..
CURSOR_SHARING_FORCE 힌트
·
Oracle/Performance
Oracle 23ai(23.4)에 CURSOR_SHARING_FORCE 힌트가 추가되었습니다. CURSOR_SHARING_FORCE 힌트를 사용하면 구문 레벨에서 Cursor Sharing 기능을 Force로 설정할 수 있습니다.-- 1SELECT name, inverse, target_level, version FROM v$sql_hint WHERE name IN ('CURSOR_SHARING_EXACT', 'CURSOR_SHARING_FORCE');NAME INVERSE TARGET_LEVEL VERSION-------------------- -------------------- ------------ -------CURSOR_SHARING_EXA..
바인드 변수 값 조회
·
Oracle/Performance
2018년 11월 19일에 작성한 "바인드 변수 값 조회" 글을 보완한 글입니다. Oracle 데이터베이스는 V$SQL_BIND_CAPTURE 뷰, V$SQL 뷰의 bind_data 칼럼, V$SQL_PLAN 뷰의 other_xml 칼럼, V$SQL_MONITOR 뷰의 binds_xml 칼럼 등에 바인드 변수 관련 데이터를 저장합니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다.-- 1DROP TABLE t1 PURGE;CREATE TABLE t1 (c1, c2, c3, c4) ASSELECT 1, 'A', DATE '2050-01-01', TIMESTAMP '2050-01-01 00:00:00.123456' FROM DUAL; 아래와 같이 다양한 데이터 타입의 바인드 변수를 사용한 쿼리를 수행하..
파티셔닝을 통한 GC 경합 해소
·
Oracle/Performance
예전에 작성한 Right Growing Index 경합 해소 글에서 인스턴스 ID의 가상 칼럼을 서브 파티션 키로 사용해 GC 경합을 해소하는 방법을 소개했습니다. 이 방법은 아래와 같이 이미 서브 파티션을 생성한 경우에는 사용할 수 없습니다. 이번 글에서 다중 칼럼 리스트 파티션을 사용해 GC 경합을 해소하는 방법을 살펴보겠습니다.-- 1CREATE TABLE t1 ( dt DATE , id NUMBER , vl NUMBER)PARTITION BY RANGE (dt)SUBPARTITION BY HASH (id) SUBPARTITION TEMPLATE ( SUBPARTITION sp_1 , SUBPARTITION sp_2) ( PARTITION p_20240101 VALUES LES..
SQL 파싱 순서
·
Oracle/Performance
SQL Tuning Guide는 SQL 파싱이 Syntax Check -> Semantic Check -> Shared Pool Check 순서로 수행된다고 설명하고 있지만 실제로는 Shared Pool Check가 가장 먼저 수행되는 것으로 보입니다. 테스트를 위해 아래와 같이 Shared Pool을 Flush하겠습니다. -- 1-1 ALTER SYSTEM FLUSH SHARED_POOL; -- 1-2: SYS SELECT kglnaobj, kglhdnsd, kglobt03, kglobhd6 FROM x$kglcursor WHERE kglhdadr != kglhdpar AND kglnaobj IN ('SELECT * FORM T1', 'SELECT * FROM T1'); no rows selected ..
INDEX_STATS 힌트
·
Oracle/Performance
지난 COLUMN_STATS 힌트 글에 이어 INDEX_STATS 힌트의 동작을 살펴보겠습니다. INDEX_STATS 힌트의 구문은 아래와 같습니다. /*+ INDEX_STATS(tablespec indexspec method adjustment) */ method에 아래의 항목을 사용할 수 있습니다. { SET | SCALE | SAMPLE | DEFAULT } adjustment는 아래의 형식으로 사용하며 다수의 항목을 함께 사용할 수 있습니다. { BLOCKS | KEYS | CLUSTERING_FACTOR | INDEX_ROWS } = value 테스트를 위해 아래과 같이 테이블과 인덱스를 생성하고 통계정보를 수집하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t..
COLUMN_STATS 힌트
·
Oracle/Performance
지난 TABLE_STATS 힌트 글에 이어 COLUMN_STATS 힌트의 동작을 살펴보겠습니다. COLUMN_STATS 힌트의 구문은 아래와 같습니다. /*+ COLUMN_STATS(tablespec columnspec method adjustment) */ method에 아래의 항목을 사용할 수 있습니다. { SET | SCALE | SAMPLE | DEFAULT } adjustment는 아래의 형식으로 사용하며 다수의 항목을 함께 사용할 수 있습니다. { DISTINCT | NULLS | LENGTH | MIN | MAX } = value 테스트를 위해 아래과 같이 테이블을 생성하고 통계정보를 수집하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1 NUMBE..
TABLE_STATS 힌트
·
Oracle/Performance
OPT_ESTIMATE 힌트처럼 아래의 세 가지 힌트도 SQL Tuning Advisor(STA)가 내부적으로 사용하는 문서화되지 않은 힌트입니다. 이번 글에서 TABLE_STATS 힌트의 동작을 살펴보고, 다음 글에서 COLUMN_STATS, INDEX_STATS 힌트를 살펴보겠습니다. SELECT name , RTRIM (CASE WHEN BITAND (target_level, 1) != 0 THEN 'STATEMENT + ' END || CASE WHEN BITAND (target_level, 2) != 0 THEN 'QUERY BLOCK + ' END || CASE WHEN BITAND (target_level, 4) != 0 THEN 'OBJECT + ' END || CASE WHEN BITAN..
OPT_ESTIMATE 힌트
·
Oracle/Performance
OPT_ESTIMATE 힌트는 SQL Tuning Advisor(STA)가 내부적으로 사용하는 문서화되지 않은 힌트입니다. SELECT name , RTRIM (CASE WHEN BITAND (target_level, 1) != 0 THEN 'STATEMENT + ' END || CASE WHEN BITAND (target_level, 2) != 0 THEN 'QUERY BLOCK + ' END || CASE WHEN BITAND (target_level, 4) != 0 THEN 'OBJECT + ' END || CASE WHEN BITAND (target_level, 8) != 0 THEN 'JOIN + ' END, '+ ') AS target_level , version FROM v$sql_hint ..