ORACLE 10g v$sql_bind_capture
from
1. v$sql_bind_capture
bind value hard parse 를 피하기 위한 기법의 하나이다. 이 변수에 들어오는 값들은
처음에 hard parse 된 정보를 가지고 soft parse 하게 된다.
9i 까지는 bind 변수에 들어오는 실값을 보기 위해서는 sql_trace 라던가 set events 를
통해 trace 해야 했다.
물론 v$sql_bind_data 나 v$sql_bind_metadata 와 같은 view 들이 있지만 실값을 표현해
주진 않는다.
이런 필요를 충족시켜주는 것이 v$sql_bind_capture view 이다.
주요용도는 bind 변수를 사용한 쿼리를 trace 하기 위해 임시변통으로 넘는 경우가 있을 수 있다. (어디까지나 개인적인 이야기이다.)
다른 용도로는 bind capture 주기 때문에 사실 의미가 없다. (다른 용도라 하면 특정 sql 로 장애가 난 경우 bind 값을 검사하려 할 텐데 이 view 를 뒤져봐도 의미 없다는 이야기이다.)
2. v$sql_bind_capture 의 주요 column
여러 column 이 있지만 주로 사용하는 부분만 이야기 하겠다.
v$sql_bind_capture
===============
address
hash_value
sql_id
name
datatype_string
was_captured
last_captured
value_string
위에서 실질적인 내용이 들어가는 항목은 name 과 datatype_string 그리고 value_string 이다. name 에는 bind 변수 이름 자체가 들어가고 datatype_string 에는 말 그대로 bind 변수의 데이터 타입 이름이 들어간다. 마지막으로 value_string 에는 bind 변수 실값이 들어간다.
address 와 hash_value 그리고 sql_id 는 어떤 sql 에 사용된 바인드 변수인가를 찾기위해 사용된다.
간단히 이야기 하자면 10g 의 경우 v$session 에 sql_id, sql_address, sql_hash_value 가
추가 되었는데 sql_address 와 sql_hash_value 를 가지고 v$sql_bind_capture 의 address,
hash_value 와 조인 조건으로 사용할 수 있다.
또 다른 경우로 v$sql 혹은 v$sqlarea 의 sql_id 를 사용해 v$sql_bind_capture.sql_id 와 join 할 수 있다.
언급하지 않은 컬럼이 was_captured 와 last_captured 값이 있는데 전자는 captured 성공 여부는 yes/no 로 표현해 주고 last_captured 는 마지막으로 캡쳐한 date 정보를 표현해 준다.
3. 예제
@f_bind.sql
col name for a10
col pos for 999
col value for a30
col catch for a5
col type for a15
select name,position pos,datatype_string type,was_captured catch,value_string value
from v$sql_bind_capture
where sql_id = (
select sql_id from v$sql
where sql_text = '&sql_text')
/
SQL> var bind_var number --bind variable 설정
SQL> exec :bind_var := 1; --value 할당
PL/SQL 처리가 정상적으로 완료되었습니다.
SQL> select object_name from dba_objects where rownum = :bind_var;
OBJECT_NAME
--------------------------------------------------------------------------------
ICOL$
SQL> @f_bind
sql_text의 값을 입력하십시오: select object_name from dba_objects where rownum =
:bind_var
구 5: where sql_text = '&sql_text')
신 5: where sql_text = 'select object_name from dba_objects where rownum = :bi
nd_var')
NAME POS TYPE CATCH VALUE
---------- ---- --------------- ----- ------------------------------
:BIND_VAR 1 NUMBER YES 1
-- bind_var 에 1을 할당한 값을 확인할 수 있었다.