bind peeking--绑定变量窥视
绑定变量窥视,就是指oracle在第一次解析SQL语句的时候(也就是说该SQL第一次传入shared pool),会将你输入的绑定变量的值带入SQL语句里,从而参考你的字面值来猜测该SQL大概会返回多少条记录,从而得到优化的执行计划。然后,以后再次执行相同的SQL语句时,不再考虑你所输入的绑定变量的值,直接取出第一次生成的绑定变量。但是,很可惜的是,使用绑定变量从而共享游标与SQL优化是两个矛盾的目标。Oracle使用绑定变量的前提,是oracle认为大部分的列的数据都是分布比较均匀的。从而,使用第一次的绑定变量的值所得到的执行计划,大多数情况下都能适用于该绑定变量的其他的值。很明显,如果第一次传入的绑定变量的值恰好占整个数据量的百分比较高,从而导致全表扫描的执行计划。而后来传入的绑定变量的值都占整个数据量的百分比都很低,则应该走索引扫描会更好的,但是由于使用了绑定变量,从而oracle并不会再去看你的绑定变量的值,而是直接拿全表扫描的执行计划来用。这时,由于使用了绑定变量,虽然我们达到了游标共享,从而节省CPU的目的,但是SQL的执行计划却不够优化了。
实验
SCOTT@ fyl>create table t1 as select * from dba_objects;
SCOTT@ fyl>create index t1_id on t1(object_id);
SCOTT@ fyl>execute dbms_stats.gather_table_stats(ownname => 'SCOTT',tabname => 'T1' ,method_opt => 'for all indexed columns' ,cascade => true);SCOTT@ fyl>var id number;
SCOTT@ fyl>exec :id :=100;
SCOTT@ fyl>set autotrace traceonly;
SCOTT@ fyl>select * from t1 where object_id<:id;
98 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 2288890262
-------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3272 | 313K| 17 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T1 | 3272 | 313K| 17 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | T1_ID | 589 | | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------2 - access("OBJECT_ID"<TO_NUMBER(:ID))Statistics
----------------------------------------------------------1 recursive calls0 db block gets18 consistent gets0 physical reads0 redo size10120 bytes sent via SQL*Net to client485 bytes received via SQL*Net from client8 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)98 rows processedSCOTT@ fyl>exec :id :=50000;
SCOTT@ fyl>select * from t1 where object_id<:id;
49588 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 2288890262
-------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3272 | 313K| 17 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T1 | 3272 | 313K| 17 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | T1_ID | 589 | | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------2 - access("OBJECT_ID"<TO_NUMBER(:ID))Statistics
----------------------------------------------------------0 recursive calls0 db block gets7887 consistent gets0 physical reads0 redo size5495043 bytes sent via SQL*Net to client36774 bytes received via SQL*Net from client3307 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)49588 rows processed由于使用了绑定变量导致两次执行计划一样,Plan hash value: 2288890262
SCOTT@ fyl>select /*+full(t1) */ * from t1 where object_id<:50000;
49588 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3272 | 313K| 262 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| T1 | 3272 | 313K| 262 (1)| 00:00:04 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------1 - filter("OBJECT_ID"<TO_NUMBER(:ID))Statistics
----------------------------------------------------------1 recursive calls0 db block gets4198 consistent gets0 physical reads0 redo size2349310 bytes sent via SQL*Net to client36774 bytes received via SQL*Net from client3307 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)49588 rows processed
走索引时 object_id<:50000-- 7887 consistent gets
全表扫描时 object_id<:50000-- 4198 consistent gets
OPT_PARAM('_optim_peek_user_binds' 'false')
select /*+opt_param('_optim_peek_user_binds', 'false')*/ id,name from test1 where id=:fid;
11G--ACS其实就是根据不同绑定变量的值为同一个SQL生成更多更优的执行计划,来适应data skew的不同情况
具体可参见 http://blog.itpub.net/15415488/viewspace-621535
bind peeking--绑定变量窥视相关推荐
- oracle 11g 新特性之动态绑定变量窥视(一)
以前在it168发过,现在转过来. 1. 11g之前的绑定变量窥视 我们都知道,为了能够让SQL语句共享执行计划,oracle始终都是强调在进行应用系统的设计时,必须使用绑定变量,也就是用一个 ...
- 绑定变量和BIND PEEKING
http://www.oraclefans.cn/forum/showtopic.jsp?rootid=5467&CPages=1 http://blog.csdn.net/tianlesof ...
- 绑定变量窥测(Bind Variable Peeking)
绑定变量窥测是oracle在进行硬解析生成执行计划的时候会窥探绑定变量的真实值,去评估绑定变量的谓词条件的选择率,影响执行计划是选择访问路径是先走索引扫描进而去访问表还是直接走全表扫描. 没有绑定变量 ...
- PLSQL_性能优化系列07_Oracle Parse Bind Variables解析绑定变量
2014-09-25 Created By BaoXinjian 一.绑定变量用法和使用场合 使用绑定变量的重要性:如果不使用绑定变量而使用常量,会导致大量硬解析.由于硬解析的种种危害,不使用绑定变量 ...
- Oracle 变量绑定与变量窥视合集系列一
<Oracle 变量绑定与变量窥视合集> 数据库环境 LEO1@LEO1> select * from v$version; BANNER --------------------- ...
- Oracle绑定变量分级(Bind Graduation)
Oracle绑定变量分级(Bind Graduation) 绑定变量分级(Bind Graduation)是指Oracle在PL/SQL代码中会根据文本型绑定变量的定义长度而将这些文本型绑定变量分为四 ...
- Oracle 变量绑定与变量窥视合集系列三
三 用示例演示一次分析,多次执行的示例,并对给出演示结果 我们分别演示硬解析 软解析 执行不同组合 实验 没有绑定变量 LEO1@LEO1> drop table leo3 purge; ...
- linux获取bind返回值信息,v$sql_bind_capture 获取绑定变量信息
截取自 v$sql_bind_capture 对于游标中定义的每一个绑定变量都会有视图中的一行对应.主要包含三个部分:指向父游标(hash_value, address)和子游标(hash ...
- Oracle 绑定变量 详解 .
之前整理过一篇有关绑定变量的文章,不太详细,重新补充一下. Oracle 绑定变量 http://blog.csdn.net/tianlesoftware/archive/2009/10/17/467 ...
- Oracle面对“数据倾斜列使用绑定变量”场景的解决方案
1. 背景知识介绍 我们知道,Oracle在传统的OLTP(在线事务处理)类系统中,强烈推荐使用绑定变量,这样可以有效的减少硬解析从而增加系统的并发处理能力.甚至在有些老旧系统,由于在开始开发阶段缺乏 ...
最新文章
- 第一周 01-复杂度2 Maximum Subsequence Sum
- Webservice开发之xsd中开发请求数据的响应接口
- WinForm之创建word并操作文档
- HihoCoder - 1175 拓扑排序·二
- 【潜龙勿用】中国制造业数字化转型大潮下的冷思考
- 绝,Java 中创建对象的 5 种方法!
- oracle空格分割字符串,Oracle字符串分割的处理
- 机器学习-1-.py文件的导入问题
- 集成光子芯片Micro-comb原理
- GitHub:一款基于OCR技术的翻译器
- 微信小程序下拉刷新组件加载图片(三个小点)不显示的问题
- android 修改双卡铃声,Android 修改系统来电铃声
- [Vue warn]: The client-side rendered virtual DOM tree is not matching server-rendered content.
- Altium Designer 18安装教程(内含crack和package)
- openwrt 内网域名 解析错误
- LabVIEW使用POST调用有道翻译
- 求1!+2!+...+10!的值
- 【论文阅读|深读】VERSE: Versatile Graph Embeddings from Similarity Measures
- 【强化学习PPO算法】
- [Cougaar]Cougaar快速开始指导(Cougaar Quick Start Guide)
热门文章
- Codeforces 950C Zebras ( 贪心 模拟 )
- PCB板子焊接注意事项及小技巧
- python 求定积分
- .NET软件授权管理解决方案Eziriz .NET IntelliLock控件详细介绍
- JSHOP2学习2:十分钟建立一个舒适的编译环境
- client wants service A, but it has B. Dropping connection.
- 离散数学——哈斯图,最大最小值,极大极小值,上界和下界
- 本安计算机电缆执行标准,阻燃本安计算机信号电缆ZR-IA-DJYPVRP-1*2*1.5
- 蒋建平:国内云计算刚刚起步
- 世纪互联加入云计算专委会 推动应用进程