绑定变量窥测(Bind Variable Peeking)

绑定变量窥测是oracle在进行硬解析生成执行计划的时候会窥探绑定变量的真实值,去评估绑定变量的谓词条件的选择率,影响执行计划是选择访问路径是先走索引扫描进而去访问表还是直接走全表扫描。

没有绑定变量窥测这一特性的时候oracle怎么去评估选择性那,是基于字段统计信息中ndv,ndv接近表的行数的时候,选择性越高,走索引的概率越大,ndv越小,则选择性越差,走全表扫描的概率也就越大,但是在真实环境中,很多业务场景中字段取值都不均匀的,这个时候使用ndv去评估选择性显然不合理,所以绑定变量窥测会参考字段的取值,字段直方图等统计信息,会评估出一个可靠的选择率,这个时候优化器再去做选择就准确多了。

绑定变量窥测的好处是能够准确的生成第一次语句执行的时候的执行计划,但是由于游标共享,之后相同的语句再次执行的时候不会再去窥探,这个是使用绑定变量的一个不好之处。

绑定变量窥测在oracle 9i中被引入,受到隐藏参数_optim_peek_user_binds的控制,并且该参数的默认值是true,就是说,绑定变量窥测这一特性默认是启用的。

优化器是否使用绑定变量窥测去生成执行计划那,可以打印cursor中的执行计划观察这一特性的作用。

 1 select * from table(dbms_xplan.display_cursor(‘d0g5mw5skptkq‘,0,‘allstats advanced last‘));
 2
 3 SQL_ID  d0g5mw5skptkq, child number 0
 4 -------------------------------------
 5 select * from t1 where owner = :owner
 6
 7 Plan hash value: 3617692013
 8
 9 ---------------------------------------------------------------------------
10 | Id  | Operation         | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
11 ---------------------------------------------------------------------------
12 |   0 | SELECT STATEMENT  |      |        |       |   427 (100)|          |
13 |*  1 |  TABLE ACCESS FULL| T1   |  90944 |     9M|   427   (1)| 00:00:01 |
14 ---------------------------------------------------------------------------
15
16 Query Block Name / Object Alias (identified by operation id):
17 -------------------------------------------------------------
18 - SEL$1 / [email protected]$1
19 Peeked Binds (identified by position):
20 --------------------------------------
21 - :1 (VARCHAR2(30), CSID=178): ‘SYS‘
22
23 Predicate Information (identified by operation id):
24 ---------------------------------------------------
25 - filter("OWNER"=:OWNER)

执行计划的黄色部分所以,oracle在生成此执行计划的时候,用到了绑定变量窥测,由于‘SYS’在列中的选择率太低,所以优化器选择走全表扫描的表访问路径。

时间: 2024-10-18 15:44:15

绑定变量窥测(Bind Variable Peeking)的相关文章

Oracle绑定变量窥探

随着具体输入值的不同,SQL的where条件的可选择率(Selectivity)和结果集的行数(Cardinality)可能会随之发生变化,而Selectivity和Cardinality的值会直接影响CBO对于相关执行步骤成本值的估算,进而影响CBO对SQL执行计划的选择.这就意味着随着具体输入值的不同,目标SQL执行计划可能会发生变化. 对于不使用绑定变量的SQL而言,具体输入值一量发生了变化,目标SQL的SQL文本就会随之发生变化,这样Oracle就能很容易地计算出对应Selectivit

【PLSQL】绑定变量,动态SQL,硬解析和软解析

************************************************************************   ****原文:blog.csdn.net/clark_xu 徐长亮的专栏 ************************************************************************ 1.1 变量 在匿名块或者存储过程中定义的变量为局部变量,及作用域在整个匿名块或存储过程中.运行结束,则该变量就不存在了: 绑定变

PLSQL_性能优化系列07_Oracle Parse Bind Variables解析绑定变量

2014-09-25 BaoXinjian 一.绑定变量用法和使用场合 使用绑定变量的重要性:如果不使用绑定变量而使用常量,会导致大量硬解析.由于硬解析的种种危害,不使用绑定变量往往是影响oracle性能和扩展性的最大问题 以下为一些错误写法和正确写法的例子 1. PLSQL中普通查询 (1). 错误写法 SELECT * FROM emp WHERE empno=123; (2). 正确写法(未使用绑定变量) Empno:=123;SEELCT* FROM emp WHERE empno=:e

Oracle之绑定变量 2

绑定变量(bind variable)我们经常在写plsql中用到,那我们承接上一节的来看看在plsql中静态sql和动态sql在绑定变量的区别 declare     v_value_a varchar2(100);     v_value_b varchar2(100);     v_name  varchar2(50); begin     v_value_a := 'SMITH';     select e.ename/*+test*/into v_name from scott.emp

Oracle 学习之性能优化(三)绑定变量

根据Oracle 学习之性能优化(二)游标中的描述,我们知道如下两条语句是不共享的. select * from emp where empno=7698; select * from emp where empno=7566; 这样就造成每次执行用户的查询都要进行硬解析,但是我们知道,其他这两个语句的执行计划应该是相同.那么有什么方法能避免不必要的硬解析吗?这里我们提供2种方法. 一.绑定变量 SQL> variable empno number; SQL> exec :empno := 7

Oracle 数据库的绑定变量特性及应用

Oracle 数据库的绑定变量特性及应用[-----]转载自https://www.cnblogs.com/rootq/(原地址) 关键词: 绑定变量(binding variable),共享池(shared buffer pool), SGA(system global area); 在开发一个数据库系统前,有谁对Oracle 系统了解很多,尤其是它的特性,好象很少吧;对初学者来讲,这更是不可能的事情;仅仅简单掌握了SQL的写法,就开始了数据库的开发,其结果只能是开发一个没有效率,也没有可扩展

OTL翻译(5) -- otl_stream流相关绑定变量

声明绑定变量 本章节将详细的说明如何在otl_stream流里面声明绑定变量. SQL语句.SQL语句块或存储过程在程序里面使用的时候总是带有占位符.OTL里面带有一个小的解析器用来解析这些占位符,并且在内部进行变量的内存分配操作. 在ORACLE里面占位符的表示方法与其他数据库不同,在ORACLE里面的占位符是通过带有冒号的前缀来表示的,如::f1/:supervisor_name/:employee_id等,并且同一个占位符可能在同一个SQL语句里面使用多次. 在ODBC或DB2 CLI里面

Oracle --获取绑定变量的值.

SELECT * FROM DBA_HIST_SQLBIND WHERE SNAP_ID>67073 AND SNAP_ID<=67079 AND SQL_ID='3DR3410F086P4';SELECT * FROM v$sql_bind_capture where sql_id='' http://blog.itpub.net/22034023/viewspace-689802/ 通过v$sql_bind_capture视图,可以查看绑定变量,但是这个视图不太给力,只能捕获最后一次记录的

对话框控件绑定变量及操作

对话框控件绑定变量 右键单击控件,添加变量. 复选框:添加变量为控件变量.可以操作控件. 列表框:选择添加变量的控件的ID. 列表框:选择添加的变量的类别,Control为控件控制类型.Value为关联值变量,可以设置数据验证 编辑框:添加的控件变量名. 复选框:不选中,则为控件关联一个变量.不可以操作控件. 列表框:选择关联变量类型. 编辑框:添加的控件变量名.  头文件中添加的变量 // CMFCTestDlg dialog class CMFCTestDlg : public CDialo