안녕하세요... 한가지 의문 사항이 있서 질문을 올립니다.
오라클 버전 : 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 이름이 같은지 많은 고수님들의 답변 부탁 드립니다.
그럼 오늘도 좋은 하루 되세요.
100% 동일한 SQL 문장인데도 불구하고 공유되지 않는 경우 Child 커서를 생성하게 됩니다.
완벽하게 똑같은 SQL이라면 유저가 다르더라도 SQL구문은 하나만 등록하여 공유하고(v$sqlarea)
구문은 같으나 실행계획이 달라야 할 경우에는 하나의 SQL구문에 Child 커서를 생성합니다(v$sql)
http://wiki.gurubee.net/pages/viewpage.action?pageId=4948091