Parent and Child Cursors
(상위 커서/하위 커서, 부모 커서/자식 커서)
"커서"는 사용자가 실행하는 SQL 문에 할당되는 라이브러리 캐시의 메모리 영역입니다. 이 메모리 영역은 SQL 텍스트, SQL 실행 계획, 통계 등과 같은 SQL 문에 대한 주요 정보를 저장합니다.
각 SQL 문에는 하나의 상위 커서와 하나 이상의 하위 커서가 있습니다. 상위 및 하위 커서가 무엇인지 설명합니다.
커서 = 메모리 영역을 염두에 두십시오.
왜 커서가 두 종류인가?
두 종류의 커서(부모 및 자식)가 있는 것은 Oracle 데이터베이스 설계에 따른 것입니다.
실행하는 각 SQL 문에 대해 Oracle 엔진은 상위 및 하위 커서라는 두 개의 커서를 생성합니다. 동일한 SQL 문에 대해 다른 바인드 값이나 두 개의 다른 스키마 또는 다른 리터럴 값 등이 있을 수 있는 것과 같은 다른 차이점이 있을 수 있기 때문에 두 개의 커서가 생성됩니다.
상위 커서는 SQL 문을 보유하고 하위 커서는 정보를 보유합니다. 차이점과 관련이 있습니다. 이것은 본질적으로 SQL 문이 하드 또는 소프트 구문 분석을 수행할 것인지 여부를 결정하는 요소로 자식 커서를 만듭니다.
PARENT CURSOR
- 커서의 SQL 텍스트를 저장합니다. 두 문장이 동일한 경우 동일한 상위 커서를 공유합니다.
- 모든 상위 커서는 그에 대해 생성된 하나 이상의 하위 커서와 함께 실행됩니다.
- 상위 커서는 V$SQLAREA 뷰에 표시됩니다. v$sqlarea의 VERSION_COUNT 열은 이 부모 커서에 몇 개의 자식 커서가 있는지 알려줍니다.
CHILD CURSOR
- 부모 커서는 적어도 하나의 자식 커서를 가진다.
- 상위 커서는 SQL 텍스트를 저장하지만, 하위 커서는 환경 정보, 통계 정보, 바인드 변수 정보, 실행 세부 정보와 같은 SQL 문과 관련된 중요한 정보를 저장합니다.
- SQL 텍스트가 자식 커서에 저장되지 않으므로 자식 커서는 메모리 공간을 덜 차지합니다.
- 모든 자식 커서는 부모에 속해야 합니다.
- 쿼리에 대해 자식 커서는 하드 파싱을 할지 또는 소프트 파싱을 할지를 결정합니다. SQL 쿼리가 동일해서 부모 커서는 동일하지만 자식 커서가 공유되지 않고 하드 파싱(재컴파일)을 하는 상황이 있을 수 있습니다.
- 상위 커서는 V$SQL 보기에 표시됩니다.
- V$SQL_SHARED_CURSOR는 옵티마이저가 커서를 비공유로 표시하기로 결정한 이유를 제공하므로 매우 유용한 보기입니다. 따라서 SQL 문이 동일하지만 하드파싱이 발생 때 이 뷰를 참조합니다.
V$SQL_SHARED_CURSOR
동일한 상위 커서에 대해 둘 이상의 하위 커서가 생성되되어었을 때 기존 하위 커서와 공유되지 않는 이유를 설명합니다. 뷰의 각 열은 커서를 공유할 수 없는 이유를 식별합니다. 공유되지 않은 사유의 열 값은 "Y" 로 표시됩니다.
특정 자식은 여러 가지 이유로 공유에 실패했을 수 있습니다. 이 이유는 다른 기존 자식 커서를 사용하려는 이유가 됩니다.
cursor_sharing 파라미터
CURSOR_SHARING은 어떤 SQL이 동일한 커서를 공유할 수 있는지를 결정합니다. 세 가지 값이 있습니다.
EXACT
동일한 텍스트가 있는 SQL 구문만 동일한 커서를 공유할 수 있습니다.
FORCE
일부 문자가 다를 경우 그 문자가 SQL문의 의미에 영향을 미치지 않는 한 강제로 커서를 공유합니다.
SIMILAR
문자가 SQL문의 의미나 실행계획 최적화에 영향을 미치지 않는 한 일부 문자가 달라도 동일한 커서로 공유하도록 합니다.
cursor_sharing의 default는 EXACT입니다.
예를 들어 아래 두 개의 서로 다른 SQL 문이 있습니다.
select * from EMP WHERE EMPNO=7369;
select * from EMP where EMPNO=7369;
둘 다 동일한 결과를 생성하지만 이들은 서로 다른 SQL입니다. "where"를 보면 첫 번째 문장에서는 대문자로, 두 번째 문장에서는 소문자로 작성되어 있는데 Oracle optimizer는 두 개를 상이한 SQL로 판단합니다.
V$SQLAREA 뷰를 조회합니다. 부모 커서에 대한 정보를 보여줍니다.
V$SQLAREA 에서는 SQL문에 대한 Parsing 정보 (sql text, sql_id, parse calls, executions 등)와 메모리 사용량, CPU 사용량, 수행시간, 모듈정보 등 외에도 많을 정보를 확인할 수 있습니다.
select *
from v$sqlarea
where upper(sql_text) like upper('%select * from EMP%7369%')
and upper(sql_text) not like upper('%v$sqlarea%');
-- SQL 수행경과
SQL_TEXT SQL_ID SHARABLE_MEM PERSISTENT_MEM RUNTIME_MEM SORTS VERSION_COUNT LOADED_VERSIONS OPEN_VERSIONS USERS_OPENING FETCHES EXECUTIONS PX_SERVERS_EXECUTIONS END_OF_FETCH_COUNT USERS_EXECUTING LOADS FIRST_LOAD_TIME INVALIDATIONS PARSE_CALLS DISK_READS DIRECT_WRITES DIRECT_READS BUFFER_GETS APPLICATION_WAIT_TIME CONCURRENCY_WAIT_TIME CLUSTER_WAIT_TIME USER_IO_WAIT_TIME PLSQL_EXEC_TIME JAVA_EXEC_TIME ROWS_PROCESSED COMMAND_TYPE OPTIMIZER_MODE OPTIMIZER_COST OPTIMIZER_ENV OPTIMIZER_ENV_HASH_VALUE PARSING_USER_ID PARSING_SCHEMA_ID PARSING_SCHEMA_NAME KEPT_VERSIONS ADDRESS HASH_VALUE OLD_HASH_VALUE PLAN_HASH_VALUE FULL_PLAN_HASH_VALUE MODULE MODULE_HASH ACTION ACTION_HASH SERIALIZABLE_ABORTS OUTLINE_CATEGORY CPU_TIME ELAPSED_TIME OUTLINE_SID LAST_ACTIVE_CHILD_ADDRESS REMOTE OBJECT_STATUS LITERAL_HASH_VALUE LAST_LOAD_TIME IS_OBSOLETE IS_BIND_SENSITIVE IS_BIND_AWARE CHILD_LATCH SQL_PROFILE SQL_PATCH SQL_PLAN_BASELINE PROGRAM_ID PROGRAM_LINE# EXACT_MATCHING_SIGNATURE FORCE_MATCHING_SIGNATURE LAST_ACTIVE_TIME BIND_DATA TYPECHECK_MEM IO_CELL_OFFLOAD_ELIGIBLE_BYTES IO_INTERCONNECT_BYTES PHYSICAL_READ_REQUESTS PHYSICAL_READ_BYTES PHYSICAL_WRITE_REQUESTS PHYSICAL_WRITE_BYTES OPTIMIZED_PHY_READ_REQUESTS LOCKED_TOTAL PINNED_TOTAL IO_CELL_UNCOMPRESSED_BYTES IO_CELL_OFFLOAD_RETURNED_BYTES CON_ID IS_REOPTIMIZABLE IS_RESOLVED_ADAPTIVE_PLAN
select * from EMP WHERE EMPNO=7369 2zp7d0gmunwfj 23539 8888 6752 0 1 1 0 0 1 1 0 1 0 1 2022-01-02/00:18:14 0 1 0 0 0 7 0 0 0 0 0 0 1 3 FIRST_ROWS 3 E289FB89D011220170020080AEF5C3E2CFFA332056414555519521105545551545545558591555449665851D5511058555555155515122555415A0EA0C5551454265415454449081566E001696C6A355451501025415404416FD157151551555550001550A16214545D1C31444A1011015595510250153355555155551E91F1411855B0501655D56456144551525245005F9A4160090505165551695504415957945000544000A5AD01122010502000002000000100000000100002000000210D007000000D00700002003000101000038F8000200000090010000E80300D0112201026564640202643202320000020003020A0A05050A1400020000F4010000640A0A0A0A64E803000064C010030200020000FFFF00000202324000400000E803000010270000002000000A1E03C80000080000010000102700000304810A80969800E80300004B64FFFF0000FFFF00000010000014A08601006440204E00000702C8C823F8FF0000FFFF00000204400A1450320A0A00001000 3703031112 95 95 SCOTT 0 000000008CA91018 3886707153 3891276153 3956160932 3634526668 TOAD 12.8.0.49 2077942562 0 0 835 1118 000000008CA908C0 N VALID 0 2022-01-02 오전 12:18:14 N N N 0 0 0 3.83665796575199E18 1.6946033956547E19 2022-01-02 오전 12:18:14 0 0 0 0 0 0 0 0 1 2 0 0 0 N
select * from EMP where EMPNO=7369 fah6htfu5fdjg 23539 8888 6752 0 1 1 1 0 1 1 0 1 0 1 2022-01-02/00:18:15 0 1 0 0 0 7 0 0 0 0 0 0 1 3 FIRST_ROWS 3 E289FB89D011220170020080AEF5C3E2CFFA332056414555519521105545551545545558591555449665851D5511058555555155515122555415A0EA0C5551454265415454449081566E001696C6A355451501025415404416FD157151551555550001550A16214545D1C31444A1011015595510250153355555155551E91F1411855B0501655D56456144551525245005F9A4160090505165551695504415957945000544000A5AD01122010502000002000000100000000100002000000210D007000000D00700002003000101000038F8000200000090010000E80300D0112201026564640202643202320000020003020A0A05050A1400020000F4010000640A0A0A0A64E803000064C010030200020000FFFF00000202324000400000E803000010270000002000000A1E03C80000080000010000102700000304810A80969800E80300004B64FFFF0000FFFF00000010000014A08601006440204E00000702C8C823F8FF0000FFFF00000204400A1450320A0A00001000 3703031112 95 95 SCOTT 0 000000008C9AD6E0 3025614383 4198020274 3956160932 3634526668 TOAD 12.8.0.49 2077942562 0 0 1245 1280 000000008A6EEB18 N VALID 0 2022-01-02 오전 12:18:15 N N N 0 0 0 3.83665796575199E18 1.6946033956547E19 2022-01-02 오전 12:18:15 0 0 0 0 0 0 0 0 1 2 0 0 0 N
Oracle DB 에서 실행한 SQL 내역을 조회하고자 할때 v$sql 딕셔너리 뷰를 이용할 수 있습니다.
V$SQL을 조회해 봅니다. 아래와 같이 2개의 SQL 문이 조회됩니다.
v$sql 에는 실행한 SQL 문과 실행 시작시간, 종료시간, 경과시간 등의 다양한 정보가 들어있습니다.
select sql_text, sql_id, sharable_mem, loaded_versions, open_versions, executions,
loads, parse_calls, buffer_gets, rows_processed, elapsed_time,
is_obsolete, is_bind_sensitive, is_bind_aware
from v$sql
where upper(sql_text) like upper('%select * from EMP%7369%')
and upper(sql_text) not like upper('%v$sql%');
-- SQL 수행결과
SQL_TEXT SQL_ID SHARABLE_MEM LOADED_VERSIONS OPEN_VERSIONS EXECUTIONS LOADS PARSE_CALLS BUFFER_GETS ROWS_PROCESSED ELAPSED_TIME IS_OBSOLETE IS_BIND_SENSITIVE IS_BIND_AWARE
select * from EMP WHERE EMPNO=7369 2zp7d0gmunwfj 23539 1 0 1 1 1 7 1 1118 N N N
select * from EMP where EMPNO=7369 fah6htfu5fdjg 23539 1 1 1 1 1 7 1 1280 N N N
V$SQL_SHARED_CURSOR
로드된 각 자식 커서에 대한 정보를 보여줍니다.
커서를 공유할 수 없는 이유를 설명하는 컬럼을 가지고 있습니다.
select * from v$sql_shared_cursor
where sql_id in('2zp7d0gmunwfj','fah6htfu5fdjg');
-- SQL 수행 결과
SQL_ID ADDRESS CHILD_ADDRESS CHILD_NUMBER UNBOUND_CURSOR SQL_TYPE_MISMATCH OPTIMIZER_MISMATCH OUTLINE_MISMATCH STATS_ROW_MISMATCH LITERAL_MISMATCH FORCE_HARD_PARSE EXPLAIN_PLAN_CURSOR BUFFERED_DML_MISMATCH PDML_ENV_MISMATCH INST_DRTLD_MISMATCH SLAVE_QC_MISMATCH TYPECHECK_MISMATCH AUTH_CHECK_MISMATCH BIND_MISMATCH DESCRIBE_MISMATCH LANGUAGE_MISMATCH TRANSLATION_MISMATCH BIND_EQUIV_FAILURE INSUFF_PRIVS INSUFF_PRIVS_REM REMOTE_TRANS_MISMATCH LOGMINER_SESSION_MISMATCH INCOMP_LTRL_MISMATCH OVERLAP_TIME_MISMATCH EDITION_MISMATCH MV_QUERY_GEN_MISMATCH USER_BIND_PEEK_MISMATCH TYPCHK_DEP_MISMATCH NO_TRIGGER_MISMATCH FLASHBACK_CURSOR ANYDATA_TRANSFORMATION PDDL_ENV_MISMATCH TOP_LEVEL_RPI_CURSOR DIFFERENT_LONG_LENGTH LOGICAL_STANDBY_APPLY DIFF_CALL_DURN BIND_UACS_DIFF PLSQL_CMP_SWITCHS_DIFF CURSOR_PARTS_MISMATCH STB_OBJECT_MISMATCH CROSSEDITION_TRIGGER_MISMATCH PQ_SLAVE_MISMATCH TOP_LEVEL_DDL_MISMATCH MULTI_PX_MISMATCH BIND_PEEKED_PQ_MISMATCH MV_REWRITE_MISMATCH ROLL_INVALID_MISMATCH OPTIMIZER_MODE_MISMATCH PX_MISMATCH MV_STALEOBJ_MISMATCH FLASHBACK_TABLE_MISMATCH LITREP_COMP_MISMATCH PLSQL_DEBUG LOAD_OPTIMIZER_STATS ACL_MISMATCH FLASHBACK_ARCHIVE_MISMATCH LOCK_USER_SCHEMA_FAILED REMOTE_MAPPING_MISMATCH LOAD_RUNTIME_HEAP_FAILED HASH_MATCH_FAILED PURGED_CURSOR BIND_LENGTH_UPGRADEABLE USE_FEEDBACK_STATS CON_ID
2zp7d0gmunwfj 000000008CA91018 000000008CA908C0 0 N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N 0
fah6htfu5fdjg 000000008C9AD6E0 000000008A6EEB18 0 N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N 0
V$SQLAREA 는 부모 커서에 대한 정보를 담고 있고, V$SQL 은 자식 커서에 대한 정보를 담고 있습니다.
V$SQL_SHARED_CURSOR 은 커서를 공유하지 못한 사유에 대한 정보를 담고 있습니다.
< 참조>
- Performance Tuning Basics 1 : Selectivity and Cardinality
- Performance Tuning Basics 2 : Parsing
- Performance Tuning Basics 3 : Parent and Child Cursors
- Performance Tuning Basics 4 : Bind Variables
- Performance Tuning Basics 5 : Trace and TKPROF – Part 1: Trace
- Performance Tuning Basics 6 : Trace and TKPROF – Part 2: Generating TKPROF
- Performance Tuning Basics 7 : Trace and TKPROF – Part 3: Analyzing TKPROF Files
- Performance Tuning Basics 8 : Trace File Analyzer (TRCA)
- Performance Tuning Basics 9 : Optimizer Mode
- Performance Tuning Basics 10 : Histograms
- Performance Tuning Basics 11 : Steps to analyze a performance problem
- Performance Tuning Basics 12 : Dynamic Performance Views
- Performance Tuning Basics 13 : Automatic Workload Repository (AWR) Basics
- Performance Tuning Basics 14 : Active Sessions History (ASH) Basics
- Performance Tuning Basics 15 : AWR Report Analysis
- Performance Tuning Basics 16 : Using SQL Tuning Health-Check Script (SQLHC)
'ORACLE' 카테고리의 다른 글
Oracle - 실행계획 보는 방법 (0) | 2022.01.31 |
---|---|
오라클 bind 변수 길이에 따른 bind mismatch (0) | 2022.01.02 |
컬럼에 히스토그램을 삭제하고 자동 통계가 생성되지 않도록 하려면? (0) | 2021.12.30 |
AWS Oracle RDS 장애 - Library cache lock (0) | 2021.12.28 |
cardinality란 ? (0) | 2021.12.28 |