zoukankan      html  css  js  c++  java
  • oralce SQL绑定变量话说bing peeking

        sql 绑定变量可以减少硬解析的次数,极在提高oracle内存的使用率,这一点大家应该是很清楚了。但是是否绑定变量并一定是永远安全可靠的,它对CBO产生高效正确的执行计划有时是会有影响的。假如一个表的数据有非常在的倾斜,比如一个只有一个ID字段的表T,T表上有10W条记录,其中ID=1的记录只有1条,ID=2的记录有99999条。

      如果有这么一条查询语句:select * from t where id=:x,x是一个变量。

        采用绑定变量,那么在sql语句第一次执行时,就会硬解析阶段进行bing peeking,第二次执行就不会再有硬解析,所以也就不会进行bing peeking了。如果第一次查询时,变量x=1, 那么bing peeking后, CBO产生的执行计划是将会采用全表扫描, 当进行第二次查询时,变量x=2, 由于是第二次执行,所以不进行bing peeking,也就不会重新评估执行计划,那么,还是采用全表扫描,这样的执行计划就是错误的了,应该用索引。

      所以,绑定变量后,后面的查询都会一直使用第一次的查询时产生的执行计划,但是谓词不同 可能需要不同的执行计划才能有高效的查询效率,这一点绑定变量无法顾及到,这也是绑定变量的一个缺点吧。可以通过清空共享池来使下次执行SQL进行硬解析。

      清空共享池操作语句:alter system flush shared_pool;

  • 相关阅读:
    CMU15-445 Project #2
    CMU15-445 Project #1 Buffer Pool
    挂分原因
    「杂谈」关于斜率优化维护凸包
    「题解」GYM 101620J Justified Jungle
    「题解」AGC 052 B Tree Edges XOR
    C++ MT19937 随机数 限制范围
    「题解」Codeforces 348C Subset Sums
    「学习笔记」联赛数论再学习
    「题解」洛谷 P4597 序列sequence
  • 原文地址:https://www.cnblogs.com/kundij/p/2489756.html
Copyright © 2011-2022 走看看