DBMS_XPLAN.DISPLAY_CURSOR v$sql bind-data

本文通过具体示例展示了如何使用Oracle数据库中的v$sql视图来查看SQL语句的绑定变量值,包括如何使用DBMS_SQLTUNE包的extract_binds过程提取绑定数据。

看了白鳝的一片关于v$sql 中bind_data的测试,俺也学习了一下
SQL> select * from v$version where rownum<2;


BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

SQL>  alter system flush shared_pool;


System altered.


SQL> var v1 varchar2(2);
SQL> exec :v1:='a';


PL/SQL procedure successfully completed.


SQL> select *  from test11 where id=:v1;


ID        ID1
-- ----------
ID3
---------------------------------------------------------------------------
a           1
11-APR-12 06.34.53.000000 PM




SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ADVANCED'));


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  9g1kvnud8041t, child number 0
-------------------------------------
select *  from test11 where id=:v1


Plan hash value: 1550834917


----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        |       |       |     2 (100)|          |
|*  1 |  TABLE ACCESS FULL| TEST11 |     1 |    29 |     2   (0)| 00:00:01 |


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
----------------------------------------------------------------------------


Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------


   1 - SEL$1 / TEST11@SEL$1


Outline Data
-------------


  /*+


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('11.2.0.1')
      DB_VERSION('11.2.0.1')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      FULL(@"SEL$1" "TEST11"@"SEL$1")
      END_OUTLINE_DATA
  */


Peeked Binds (identified by position):


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------


   1 - :V1 (VARCHAR2(30), CSID=852): 'a'--------初次绑定的值


Predicate Information (identified by operation id):
---------------------------------------------------


   1 - filter("ID"=:V1)


Column Projection Information (identified by operation id):
-----------------------------------------------------------


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------


   1 - "ID"[VARCHAR2,2], "TEST11"."ID1"[NUMBER,22],
       "TEST11"."ID3"[TIMESTAMP,11]


Note
-----
   - dynamic sampling used for this statement (level=2)




52 rows selected.


SQL> select dbms_sqltune.extract_binds(bind_data) bind from v$sql WHERE SQL_TEXT LIKE '%FROM TEST11%';


BIND(NAME, POSITION, DUP_POSITION, DATATYPE, DATATYPE_STRING, CHARACTER_SID, PRE
--------------------------------------------------------------------------------
SQL_BIND_SET()


SQL> select dbms_sqltune.extract_binds(bind_data) bind from v$sql WHERE SQL_TEXT LIKE '%from test11%';


BIND(NAME, POSITION, DUP_POSITION, DATATYPE, DATATYPE_STRING, CHARACTER_SID, PRE
--------------------------------------------------------------------------------
SQL_BIND_SET(SQL_BIND(NULL, 1, NULL, 1, 'VARCHAR2(32)', 852, NULL, NULL, 32, '11
-APR-12', 'a', ANYDATA()))


SQL_BIND_SET()
SQL_BIND_SET()


SQL> exec :v1:='aa';


PL/SQL procedure successfully completed.


SQL> select * from test11 where id=:v1;


ID        ID1
-- ----------
ID3
---------------------------------------------------------------------------
aa         12
12-APR-01 12.00.00.000000 AM




SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ADVANCED'));


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  gq117a08wfuy0, child number 0
-------------------------------------
select * from test11 where id=:v1


Plan hash value: 1550834917


----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        |       |       |     2 (100)|          |
|*  1 |  TABLE ACCESS FULL| TEST11 |     1 |    29 |     2   (0)| 00:00:01 |


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
----------------------------------------------------------------------------


Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------


   1 - SEL$1 / TEST11@SEL$1


Outline Data
-------------


  /*+


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('11.2.0.1')
      DB_VERSION('11.2.0.1')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      FULL(@"SEL$1" "TEST11"@"SEL$1")
      END_OUTLINE_DATA
  */


Peeked Binds (identified by position):


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------


   1 - :V1 (VARCHAR2(30), CSID=852): 'aa'------------------最近一次绑定的值


Predicate Information (identified by operation id):
---------------------------------------------------


   1 - filter("ID"=:V1)


Column Projection Information (identified by operation id):
-----------------------------------------------------------


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------


   1 - "ID"[VARCHAR2,2], "TEST11"."ID1"[NUMBER,22],
       "TEST11"."ID3"[TIMESTAMP,11]


Note
-----
   - dynamic sampling used for this statement (level=2)




52 rows selected.


SQL> select dbms_sqltune.extract_binds(bind_data) bind from v$sql WHERE SQL_TEXT LIKE '%from test11%';


BIND(NAME, POSITION, DUP_POSITION, DATATYPE, DATATYPE_STRING, CHARACTER_SID, PRE
--------------------------------------------------------------------------------
SQL_BIND_SET(SQL_BIND(NULL, 1, NULL, 1, 'VARCHAR2(32)', 852, NULL, NULL, 32, '11
-APR-12', 'a', ANYDATA()))


SQL_BIND_SET()
SQL_BIND_SET(SQL_BIND(NULL, 1, NULL, 1, 'VARCHAR2(32)', 852, NULL, NULL, 32, '11
-APR-12', 'aa', ANYDATA()))


SQL_BIND_SET()

把最近几次的值全列出来
结果是跟白鳝的是不一样的,可能是版本不通造成的

### DBMS_XPLAN.DISPLAY 参数详解及使用方法 #### 1. DBMS_XPLAN.DISPLAY 函数概述 `DBMS_XPLAN.DISPLAY` 是 Oracle 提供的一个内置函数,用于以格式化的方式显示存储在 `PLAN_TABLE` 表中的执行计划。此函数允许用户根据需要自定义输出的详细程度。 #### 2. 参数说明 `DBMS_XPLAN.DISPLAY` 的语法如下: ```sql DBMS_XPLAN.DISPLAY( table_name IN VARCHAR2 DEFAULT 'PLAN_TABLE', statement_id IN VARCHAR2 DEFAULT NULL, format IN VARCHAR2 DEFAULT 'TYPICAL' ); ``` - **table_name** 指定存储执行计划的表名。默认值为 `PLAN_TABLE`[^2]。如果在生成执行计划时指定了其他表,则需要在此参数中提供相应的表名。 - **statement_id** 指定要显示的执行计划的标识符。默认值为 `NULL`,表示显示最近一次插入到指定表中的执行计划[^2]。如果在生成执行计划时设置了 `STATEMENT_ID`,则需要在此参数中提供相同的值。 - **format** 控制输出的详细程度。支持的值包括: - `TYPICAL`:显示标准的执行计划信息(默认值)。 - `ALL`:显示所有可用的执行计划信息,包括访问路径、谓词信息和注释等。 - `BASIC`:仅显示基本的执行计划信息,如操作类型和对象名称。 - `SERIAL`:类似于 `TYPICAL`,但不显示并行查询的相关信息。 - `PARALLEL`:显示并行查询的详细信息。 - `ADVANCED`:显示更详细的执行计划信息,包括分区信息、谓词表达式和注释等[^3]。 #### 3. 使用示例 以下是一个完整的示例,展示如何使用 `DBMS_XPLAN.DISPLAY` 查看执行计划: ```sql -- 生成执行计划 EXPLAIN PLAN SET STATEMENT_ID = 'example_001' FOR SELECT * FROM employees WHERE department_id = 10; -- 查看执行计划 SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL, 'example_001', 'ALL')); ``` #### 4. 输出解释 `DBMS_XPLAN.DISPLAY` 的输出通常包括以下列: - **Plan Hash Value**:执行计划的哈希值,用于唯一标识该计划。 - **Id**:操作的编号,表示执行计划中各步骤的顺序。 - **Operation**:SQL 执行的操作类型,例如 `SELECT`, `TABLE ACCESS`, 或 `INDEX SCAN`。 - **Options**:操作的选项,例如索引扫描的类型。 - **Object Name**:涉及的对象名称,例如表或索引。 - **Cost**:优化器估算的操作成本。 - **Bytes**:优化器估算的返回数据量。 - **Rows**:优化器估算的返回行数。 #### 5. 注意事项 - 如果未创建 `PLAN_TABLE` 表,可以使用 `UTLXPLAN.SQL` 脚本来创建它。 - 在多会话环境中,确保正确使用 `STATEMENT_ID` 来区分不同的执行计划。 - 使用 `FORMAT` 参数控制输出的详细程度,以便根据需求获取必要的信息。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值