v$sql 컬럼중 module 컬럼에 대한 문의사항입니다. 0 2 3,265

by 뭉게뭉게 v$sql [2012.04.16 20:02:37]


안녕하세요... 한가지 의문 사항이 있서 질문을 올립니다.

오라클 버전 : Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
테스트 프로그램 : Orange, Sqlplus
DB사용자 : testa, testb

다음과 같이 테스트를 진행하였습니다.
(아래 쿼리들은 동일 합니다)

Orange에서 testa 유저로 다음 쿼리 실행
CREATE TABLE t1 (c1 VARCHAR2(50),c2 NUMBER);
Orange에서 바인드 변수 v2로 10을 설정
SELECT c2 FROM t1 WHERE c1 = :v2;

sqlplus에서 testb 유저로 다음 쿼리 실행
CREATE TABLE t1 (c1 VARCHAR2(50),c2 NUMBER);
VARIABLE v2 VARCHAR2(30);
SELECT c2 FROM t1 WHERE c1 = :v2;

v$sql 검색 쿼리 :
select 
 address,
 hash_value, 
 child_number,
 child_address,
 parsing_schema_id, 
 module, 
 last_load_time   
from v$sql
WHERE sql_text LIKE 'SELECT c2 FROM t1 WHERE c1 = %'

결과 :
ADDRESS  HASH_VALUE  CHILD_NUMBE CHILD_AD PARSING_SCH MODULE LAST_LOAD_TIME   
-------- ----------- ----------- -------- ----------- ---------------------  ------------------
9E955860  3308946817    0 9E95577C   61 Orange for ORACLE DBA  2012-04-16/19:41:31
9E955860  3308946817    1 9E9371A8   62 Orange for ORACLE DBA  2012-04-16/19:43:16


결과를 보면 MODULE이 Orange for ORACLE DBA로 같습니다. Sqlplus에서 실행한 쿼리에 대해선
MODULE이 Sqlplus로 찍혀서 child cursor가 생겨야 될것 같은데 Orange for ORACLE DBA로 동일하게 나옵니다.
왜 MODULE 이름이 같은지 많은 고수님들의 답변 부탁 드립니다.

그럼 오늘도 좋은 하루 되세요.

by 마농 [2012.04.17 08:23:55]

100% 동일한 SQL 문장인데도 불구하고 공유되지 않는 경우 Child 커서를 생성하게 됩니다.
완벽하게 똑같은 SQL이라면 유저가 다르더라도 SQL구문은 하나만 등록하여 공유하고(v$sqlarea)
구문은 같으나 실행계획이 달라야 할 경우에는 하나의 SQL구문에 Child 커서를 생성합니다(v$sql)
http://wiki.gurubee.net/pages/viewpage.action?pageId=4948091


by 웅 [2012.04.18 11:45:22]
지금 11.2.0.3에서 잠깐 확인했는데...
SQLid를 가진 SQL을 오랜지, sqlplus에서 다른 유저로 수행했어도 먼저 수행된 module로 전부 표시되네요.
module표현이 잘못된 상황으로 보이네요
child커서에 표현되어야 할 항목이지만 부모와 자식커서에서 공통으로 표현되어야하는 내용이라
부모커서에서는 첫번째 수행된 모듈을 조회하는 듯.

9.2.0.6.0버전에서도 동일하군요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입