发现无论启动或者关闭绑定变量窥探使用绑定变量的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绑定变量执行计划,绑定变量对执行计划的影响相关推荐

  1. oracle怎么把in值列出来,oracle – SELECT的解析和绑定变量.. WHERE列IN(..)查询

    我希望确保php Web应用程序中的所有查询都正确使用绑定变量,以最大限度地减少查询的解析. 我想知道Oracle如何解析将列与值列表进行比较的查询. Oracle会认为这些语句是相同的,还是列表必须 ...

  2. Ora-01008错误:oracle 并非所有变量都已绑定的原因

    begin test.test(a => 1, b => :603); end; 执行的时候报错: Ora-01008错误:oracle 并非所有变量都已绑定 原因是b => :60 ...

  3. oracle+并非所有变量,ORA-01008:并非所有变量都已绑定异常错误汇总解决方案

    一.异常错误介绍 我们在使用oracle数据库做程序开发时,一般都会使用plsql做客户端连接查询工具,在写sql语句时plsql经常会报并非所有变量都已绑定01008这样类似的异常错误,通常我们程序 ...

  4. Oracle 并非所有变量都已绑定

    begin test.test(a => 1, b => :603); end; 执行的时候报错: Ora-01008错误:Oracle?并非所有变量都已绑定 原因是??b => : ...

  5. oracle+并非所有变量,ORA-01008: 并非所有变量都已绑定(示例代码)

    使用oracle数据库过程中,偶尔遇到 ORA-01008: 并非所有变量都已绑定 这个错误,此时应该查检sql中是否有以下情况: 1.var sql = string.Format("se ...

  6. Oracle执行计划绑定

    点击上方"蓝字" 关注我们,享更多干货! 在Oracle中时长会出现一直运行正常的SQL突然运行很慢的问题.检查发现执行计划发生了改变,这时候就需要绑定执行计划.在Oracle 1 ...

  7. oracle定时任务报“并非所有变量都已经绑定”以及创建,删除等

    -- 查询该存储过程的定时任务 select job, next_date, next_sec, failures,what, broken from dba_jobs where what like ...

  8. Oracle:并非所有变量都已绑定

    String sql="select * from users where username=? and pwd=?"; pstat=con.prepareStatement(sq ...

  9. 解决ORA-01008: 并非所有变量都已绑定(详解问题所在)

    将executeUpdate(sql)或executeQuery(sql)括号中的sql删除. 问题代码: public static void main(String[] args) throws ...

最新文章

  1. python怎么学最快-浅谈:从为什么学习python到如何学好python
  2. MessageBox、::MessageBox 、AfxMessageBox三者的区别
  3. 定期存单丢了被别人捡到,里面的存款会不会被领走?
  4. 记录程序人生2020.8.11
  5. spring boot 自动跳转登录页面_徒手撸一个扫码登录示例工程
  6. linux性能调优干货,【干货分享】详解Linux性能调优之tuned特性
  7. java 如何判定消息已在队列_【05期】消息队列中,如何保证消息的顺序性?
  8. Mysql批量更新的一个坑-allowMultiQueries=true允许批量更新
  9. SQL Server:CASE WHEN OREN ELSE END =不支持OR
  10. Scanner初学需要注意的几个问题
  11. ubuntu stardict词典安装
  12. JS通过WebSocket实现双屏信息同步显示
  13. 类型转化异常 Java Object转 int
  14. Unity3d 微信小程序游戏
  15. kkt条件 弱对偶 强对偶_机器学习笔记(8)-对偶关系和KKT条件
  16. svc预测概率_Kaggle平台Titanic生存率预测项目(TOP3%)
  17. MySQL的时间戳2038年问题还有16年,最好在设计上的时候使用datetime就可以了,不要使用时间戳字段了,即使用了也不要用int类型进行映射,使用long类型映射即可
  18. KJ分析法(亲和图)的应用实例及知识分享
  19. abp web ui 负号提前显示
  20. 手撕HashMap(原理)

热门文章

  1. 20191219 门面设计模式
  2. 2014中国计量学院matlab考试卷,中国计量学院学习心得
  3. Linux制作系统U盘
  4. 角谷猜想(次数+过程)
  5. PCb过孔大小设置 / 丝印层字符尺寸设置
  6. HNUST 辅导上机(模拟)
  7. 计算机基础.doc免费,计算机基础教案(完整版).doc
  8. ## YARN运行资源配置
  9. 电影票房排名查询易语言代码
  10. STM32标准库的引入视频课程-第3季第6部分-朱有鹏-专题视频课程