2.3 解析(游标或者SQL)的过程包含6个步骤。
1)包含VPD的约束条件,如果系统中使用了虚拟私有数据库(VPD,以前也成为行级安全控制,row-level
security),并且被解析的SQL语句中引用的某张表激活了它的话,安全策略生成的约束条件就会被添加到where子句中。(安全策略的知识需要复
习,已经忘光了)。
2)语法、语义以及访问权限检查。
3)将父游标保存到缓存。
4)逻辑优化。
5)物理优化。
6)将自由表保存到库缓存。
软解析指包含步骤1和步骤2,硬解析则包含所有的步骤。
2.3.1 共享游标
共享游标包含父游标和子游标。
共享父游标的条件有2个:
1)SQL 语句的文本完全一致。
2)执行环境相同。包括优化参数optimizer_mode,绑定变量定义的类型和大小(大小所在的区间范围)。
2.3.2 绑定变量
2.3.2.1 优点
共享游标,减少硬解析
绑定变量分级,前面说到执行环境的变化比如绑定变量定义的类型大小不同会导致,生成不同的游标,为了使游标的数量不至于太多,产生了这个功能。此功能将变量的长度分为4个级别,0-32字节,33-128字节,129-2000字节,>2000字节,这四个等级。不用说,同一个绑定变量的变化,最多能生成4个游标。
2.3.2.2 缺点
啊?原来绑定变量也有缺点。缺点就是,相对于字面量而言,会减弱查询优化器的功能。
比如:
select count(*) from t where id > 10;
select count(*) from t where id > 99999;
根据id值10,99999和表的统计信息,查询优化器可能会选择全表扫描或者索引扫描。
使用了绑定变量,优化器会忽略他们的具体值,从而生成相同的执行计划。为了解决这个问题,oracle9i引入了绑定变量窥测(bind variable peeking)的功能。
绑定变量窥测的优点,就是窥测绑定变量的值,把它们当做字面量来使用。这样的好处,就是能获得最优查询路径,比如是选择全表扫描还是索引扫描。
绑定变量窥测的缺点,哎,凡事都有缺点啊,还是马克思够聪明啊,人家早就说了,世界是矛盾的,矛盾是对立统一的嘛。绑定变量窥测的缺点就是,生成的执行计划,依赖第一次生成执行计划时所提供的值。举例来说,就是如果第一次是全表扫描,以后永远都是全表扫描了。
那么如何避免这个缺点呢?再掏点银子出来,升级到oracle11g就行了。oracle11g引用一个新功能,扩展的游标共享。这个功能就是,根据绑定变量的值,可以为相同的sql语句,生成不同子游标,及不同的执行计划。汗,这个功能原来是oracle11g才有的,我以前想当然的以为,自oracle引入了cbo之后就有了呢。
绑定变量的结论
1 什么时候使用绑定变量?
1)sql语句处理少量数据,比如OLTP系统。
2)sql语句处理大量数据。
2 什么时候不使用绑定变量?
批量任务处理,报表生成,运用OLAP工具的数据仓库。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9741215/viewspace-668547/
,如需转载,请注明出处,否则将追究法律责任。