본문 바로가기

카테고리 없음

ORACLE 10g v$sql_bind_capture v1.0

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을 할당한 값을 확인할 수 있었다.