V$SQL_BIND_CAPTURE 뷰는 SQL 커서에서 Bind Variable이 사용된 경우 해당 Bind Variable의 이름과 유형, 값 등을 캡쳐한 정보를 제공한다.
(10g이상에서 제공)
컬럼
이름 |
유형 |
설명 |
ADDRESS |
8) |
Parent Cursor의 Address |
HASH_VALUE |
NUMBER |
Parent Cursor의 Hash Value. |
SQL_ID |
VARCHAR2(13) |
Unique SQL ID. V$SQL의 SQL_ID 컬럼과 조인 가능하다. |
CHILD_ADDRESS |
8) |
Child Cursor의 Address |
CHILD_NUMBER |
NUMBER |
Child Cursor의 번호. |
NAME |
VARCHAR2(30) |
Bind Variable의 이름. 예: :name |
POSITION |
NUMBER |
SQL 문장에서 Bind Variable의 위치. 1부터 시작한다. |
DUP_POSITION |
NUMBER |
Bind Variable의 이름이 중복되는 경우 최초 Bind Variable의 위치를 가리킨다. |
DATATYPE |
NUMBER |
Bind Variable의 데이터 유형. 오라클 내부적으로 사용되는 숫자값이다. |
DATATYPE_STRING |
VARCHAR2(15) |
Bind Variable의 데이터 유형에 대한 인식 가능한 이름. 예:NUMBER, VARCHAR2 |
CHARACTER_SID |
NUMBER |
National character set identifier |
PRECISION |
NUMBER |
Precision (for numeric binds) |
SCALE |
NUMBER |
Scale (for numeric binds) |
MAX_LENGTH |
NUMBER |
최대 Bind 길이 |
WAS_CAPTURED |
VARCHAR2(3) |
Bind 값에 대한 Capture가 이루어졌는지의 여부 (YES) 또는 (NO) |
LAST_CAPTURED |
DATE |
Bind 값에 대한 Capture가 이루어진 가장 최근 시간 |
VALUE_STRING |
VARCHAR2(4000) |
Bind 값에 대한 String 표현 |
VALUE_ANYDATA |
ANYDATA |
Bind 값에 대한 Sys.AnyData에 의한 표현 |
Bind Capture가 이루어지는 시점
QL 문장이 Hard Parse되는 시점에 Bind Variable이 사용되고 Bind 값이 부여된 경우
Bind Capture가 이루어진 이후, Bind 값이 변경된 경우. 단, 오라클의 성능상의 오버헤드를 최소화기 위해 15분 이상의 간격을 두고 Capture를 수행한다.
즉, Bind Capture된 값이 항상 최신의 값을 나타내는 것이 아니라는 것에 주의해야 한다.
Bind 값 알아내기
Oracle 10g 이전에는 특정 SQL 문장에서 사용 중인 Bind 값을 알아내고자 할 때는 Processstate Dump를 수행하거나 SQL Trace, 혹은 Audit를 수행했어야 했다. 하지만, V$SQL_BIND_CAPTURE 뷰를 사용하면 간단한 조회만으로 Bind 값을 알아낼 수 있게 되었다. 각 툴이 제공하는 값의 종류는 다음과 같이 정리할 수 있다.
Processstate Dump: 특정 Session(Process)가 "현재" 수행 중인 SQL 문장에서 사용되는 Bind 값의 목록
SQL Trace: 특정 Session이나 System 전체가 수행한 모든 SQL 문장에서 사용된 Bind 값
V$SQL_BIND_CAPTURE: SQL 문장별로 최근에 사용된 Bind 값
Audit: 특정 테이블 또는 전체 오브젝트에 대한 Select/Insert/Update/Delete에 대한 SQL 문장과 Bind 값
Bind 값의 이력
V$SQL_BIND_CAPTURE 뷰의 History 버전인 DBA_HIST_SQLBIND 뷰를 통해 과거 특정 시점에 특정 SQL 문장에서 사용된 Bind 값을 확인할 수 있다.
SQL> CREATE TABLE bind_test(id INT);
SQL> var x number;
SQL> EXEC :x := 1;
SQL> select * from bind_test where id = :x';
SQL> SELECT name, position, was_captured,
to_char(last_captured,'yyyy/mm/dd hh24:mi:ss'), value_string
FROM v$sql_bind_capture
WHERE sql_id = (SELECT sql_id FROM v$sql WHERE sql_text =
('select * from bind_test where id = :x')
NAME POSITION WAS_CAPTURED LAST_CAPTURED VALUE_STRING
---- -------- ---------- -------------- ------------
:X 1 YES 2007/10/13 00:16:19 1
1. _OPTIM_PEEK_USER_BINDS 파라미터
2. V$SQL_BIND_DATA 뷰
3. V$SQL_BIND_METADATA 뷰
4. DBA_HIST_SQLBIND
외부참조
http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/dynviews_2114.htm
출처 : 엑셈