oracle绑定变量执行计划,绑定变量对执行计划的影响
发现无论启动或者关闭绑定变量窥探使用绑定变量的SQL都有可能选择错误的执行计划,当第一次硬解析产生执行计划时,之后的绑定变量SQL就会继续这个执行计划执行,有时可能是错的。如何改进呢?
1.当关闭绑定变量窥探时
SQL> @p _optim_peek_user_binds
old 4: and lower(n.ksppinm) like lower('%&1%')
new 4: and lower(n.ksppinm) like lower('%_optim_peek_user_binds%')
NAME VALUE
---------------------------------------- ----------------------------------------
_optim_peek_user_binds FALSE
SQL> select HISTOGRAM,COLUMN_NAME,NUM_DISTINCT from user_tab_columns where TABLE_NAME='T';
HISTOGRAM COLUMN_NAME NUM_DISTINCT
--------------- -------------------------------------------------------------------------------------------------------------------------------- ------------
HEIGHT BALANCED ID 1000
FREQUENCY PAD 1
SQL> select count(*) from t;
COUNT(*)
----------
1000
SQL> EXECUTE :id := 10;
PL/SQL procedure successfully completed.
SQL> SELECT count(pad) FROM t WHERE id < :id;
COUNT(PAD)
----------
9
SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
PLAN_TABLE_OUTPUT
SQL_ID asth1mx10aygn, child number 0
-------------------------------------
SELECT count(pad) FROM t WHERE id < :id
Plan hash value: 2053823973
-------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 3 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 3 |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED| T | 1 | 50 | 9 |00:00:00.01 | 3 |
|* 3 | INDEX RANGE SCAN | T_PK | 1 | 9 | 9 |00:00:00.01 | 2 |
-------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("ID"<:id>
20 rows selected.
SQL> EXECUTE :id := 990;
PL/SQL procedure successfully completed.
SQL> SELECT count(pad) FROM t WHERE id < :id;
COUNT(PAD)
----------
989
SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
PLAN_TABLE_OUTPUT
SQL_ID asth1mx10aygn, child number 0
-------------------------------------
SELECT count(pad) FROM t WHERE id < :id
Plan hash value: 2053823973
-------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 19 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 19 |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED| T | 1 | 50 | 989 |00:00:00.01 | 19 |
|* 3 | INDEX RANGE SCAN | T_PK | 1 | 9 | 989 |00:00:00.01 | 3 |
-------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("ID"<:id>
20 rows selected.
1.当开启绑定变量窥探时
SQL> alter system set "_optim_peek_user_binds"=true scope=both;
System altered.
SQL> @p _optim_peek_user_binds
old 4: and lower(n.ksppinm) like lower('%&1%')
new 4: and lower(n.ksppinm) like lower('%_optim_peek_user_binds%')
NAME VALUE
---------------------------------------- ----------------------------------------
_optim_peek_user_binds TRUE
SQL> alter system flush shared_pool;
System altered.
SQL> EXECUTE :id := 990;
SELECT count(pad) FROM t WHERE id < :id;
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
PL/SQL procedure successfully completed.
SQL>
COUNT(PAD)
----------
989
SQL>
PLAN_TABLE_OUTPUT
SQL_ID asth1mx10aygn, child number 0
-------------------------------------
SELECT count(pad) FROM t WHERE id < :id
Plan hash value: 2966233522
-------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 28 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 28 |
|* 2 | TABLE ACCESS FULL| T | 1 | 988 | 989 |00:00:00.01 | 28 |
-------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("ID"<:id>
19 rows selected.
SQL> EXECUTE :id := 10;
PL/SQL procedure successfully completed.
SQL> SELECT count(pad) FROM t WHERE id < :id;
COUNT(PAD)
----------
9
SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
PLAN_TABLE_OUTPUT
SQL_ID asth1mx10aygn, child number 0
-------------------------------------
SELECT count(pad) FROM t WHERE id < :id
Plan hash value: 2966233522
-------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 28 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 28 |
|* 2 | TABLE ACCESS FULL| T | 1 | 988 | 9 |00:00:00.01 | 28 |
-------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("ID"<:id>
19 rows selected.
oracle绑定变量执行计划,绑定变量对执行计划的影响相关推荐
- oracle怎么把in值列出来,oracle – SELECT的解析和绑定变量.. WHERE列IN(..)查询
我希望确保php Web应用程序中的所有查询都正确使用绑定变量,以最大限度地减少查询的解析. 我想知道Oracle如何解析将列与值列表进行比较的查询. Oracle会认为这些语句是相同的,还是列表必须 ...
- Ora-01008错误:oracle 并非所有变量都已绑定的原因
begin test.test(a => 1, b => :603); end; 执行的时候报错: Ora-01008错误:oracle 并非所有变量都已绑定 原因是b => :60 ...
- oracle+并非所有变量,ORA-01008:并非所有变量都已绑定异常错误汇总解决方案
一.异常错误介绍 我们在使用oracle数据库做程序开发时,一般都会使用plsql做客户端连接查询工具,在写sql语句时plsql经常会报并非所有变量都已绑定01008这样类似的异常错误,通常我们程序 ...
- Oracle 并非所有变量都已绑定
begin test.test(a => 1, b => :603); end; 执行的时候报错: Ora-01008错误:Oracle?并非所有变量都已绑定 原因是??b => : ...
- oracle+并非所有变量,ORA-01008: 并非所有变量都已绑定(示例代码)
使用oracle数据库过程中,偶尔遇到 ORA-01008: 并非所有变量都已绑定 这个错误,此时应该查检sql中是否有以下情况: 1.var sql = string.Format("se ...
- Oracle执行计划绑定
点击上方"蓝字" 关注我们,享更多干货! 在Oracle中时长会出现一直运行正常的SQL突然运行很慢的问题.检查发现执行计划发生了改变,这时候就需要绑定执行计划.在Oracle 1 ...
- oracle定时任务报“并非所有变量都已经绑定”以及创建,删除等
-- 查询该存储过程的定时任务 select job, next_date, next_sec, failures,what, broken from dba_jobs where what like ...
- Oracle:并非所有变量都已绑定
String sql="select * from users where username=? and pwd=?"; pstat=con.prepareStatement(sq ...
- 解决ORA-01008: 并非所有变量都已绑定(详解问题所在)
将executeUpdate(sql)或executeQuery(sql)括号中的sql删除. 问题代码: public static void main(String[] args) throws ...
最新文章
- python怎么学最快-浅谈:从为什么学习python到如何学好python
- MessageBox、::MessageBox 、AfxMessageBox三者的区别
- 定期存单丢了被别人捡到,里面的存款会不会被领走?
- 记录程序人生2020.8.11
- spring boot 自动跳转登录页面_徒手撸一个扫码登录示例工程
- linux性能调优干货,【干货分享】详解Linux性能调优之tuned特性
- java 如何判定消息已在队列_【05期】消息队列中,如何保证消息的顺序性?
- Mysql批量更新的一个坑-allowMultiQueries=true允许批量更新
- SQL Server:CASE WHEN OREN ELSE END =不支持OR
- Scanner初学需要注意的几个问题
- ubuntu stardict词典安装
- JS通过WebSocket实现双屏信息同步显示
- 类型转化异常 Java Object转 int
- Unity3d 微信小程序游戏
- kkt条件 弱对偶 强对偶_机器学习笔记(8)-对偶关系和KKT条件
- svc预测概率_Kaggle平台Titanic生存率预测项目(TOP3%)
- MySQL的时间戳2038年问题还有16年,最好在设计上的时候使用datetime就可以了,不要使用时间戳字段了,即使用了也不要用int类型进行映射,使用long类型映射即可
- KJ分析法(亲和图)的应用实例及知识分享
- abp web ui 负号提前显示
- 手撕HashMap(原理)