sql执行计划[Oracle] 变量绑定

查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!

    

Parent-Child cursor (父子游标)

    

父游标:只要SQL语句文本相同,它们就对应同一个parent cursor。

    

子游标:在某些情况下,虽然SQL语句的文本相同,但是因为其它因素不同(这些因素可以在视图V$SQL_SHARED_CURSOR中查看),致使产生不同的child cursor。(重新生成child cursor,也就意味着一次硬剖析)

    


    

cursor_sharing

    

对于是不是应用绑定变量这个问题,最好是交给应用程序决议,在数据库层面是很难正确判断。(这也是为什么cursor_sharing参数默认值为exact)

    

但是,有些时候,由于应用程序没有正确应用绑定变量,致使数据库性能问题,又因为此时系统已上线,要改应用代码有很多的阻力(大多都是人为的因素)。为此,Oracle提供了应急(过后弥补)方案,可以在数据库级别强制应用绑定变量。

    

当cursor_sharing=force时,对于只有谓词条件不一样的SQL语句,Oracle统统都认为是一样的。但是这样会有一个问题,就是可能后续的执行计划不是最优。为了解决这个问题,可以设置cursor_sharing=similar,这样如果谓词条件的变更可能生成不同的执行计划,Oracle都会进行硬剖析(生成child cursor)。

    

但是,设置 cursor_sharing=similar要非常当心,因为有很多bug,需要经过充分的测试才能在生产库上修改。
    每日一道理
人的生命似洪水奔流,不遇着岛屿和暗礁,难以激起美丽的浪花。

    


    

Bind Peeking (变量窥视)

    

从Oracle9i开始,Oracle在第一次剖析SQL(hard parse)时,如果SQL上有变量绑定,会查看这个变量的值,以便于更精确的指定执行计划;但在后续的分析中(soft parse),将不会理睬这个变量的值。

    


    

实用场景
  • 执行计划几乎不转变(oltp)
  • 大量的并发
  • 大量的除谓词外几乎相同的SQL。
不实用场景
  • 执行计划会随变量值的变更而转变。
  • 少许的SQL(OLAP).

    


    

ACS (Adaptive Cursor Sharing)

    

 

    Oracle11g用于解决变量绑定带来的负面影响,通过不断视察bind的值,来决议新的SQL是不是重用之前的执行计划,解决绑定变量致使后续执行计划稳定的问题。

    缺点

    

  • 更多的硬分析
  • 产生更多的子游标,需要更多的内存。
  • 消耗更多的CPU

    


    

绑定变量的实用场景

    

实用于OLTP
  • 用户并发很高
  • 表中有主键
  • 操纵的数据少
  • 执行计划稳定
  • SQL的重复率高
不实用于OLAP
  • 执行计划多变
  • 并发用户少
  • SQL剖析对系统性能影响小

    

 

文章结束给大家分享下程序员的一些笑话语录: 人工智能今天的发展水平:8乘8的国际象棋盘其实是一个体现思维与创意的强大媒介。象棋里蕴含了天文数字般的变化。卡斯帕罗夫指出,国际象棋的合法棋步共有1040。在棋局里每算度八步棋,里面蕴含的变化就已经超过银河系里的繁星总数。而地球上很少有任何数量达到这个级别。在金融危机之前,全世界的财富总和大约是1014人民币,而地球人口只有1010。棋盘上,所有可能的棋局总数达到10120,这超过了宇宙里所有原子的总数!经典语录网

--------------------------------- 原创文章 By
sql和执行计划
---------------------------------

转载于:https://www.cnblogs.com/jiangu66/archive/2013/05/31/3111281.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值