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 은 커서를 공유하지 못한 사유에 대한 정보를 담고 있습니다.



< 참조>

 

+ Recent posts