基于Oracle的SQL优化--学习(十一)

绑定变量窥探

         当绑定变量窥探被启用后,每当 Oracle 以硬解析的方式解析使用了绑定变量的目标 SQL 时, Oracle 都会实际窥探( Peeking )一下对应绑定变量的具体输入值,并以这些具体输入值为标准,来决定这些使用了绑定变量的目标 SQL 的 where 条件的 Selectivity 和 Cardinality 的值,并据此来选择该 SQL 的执行计划。注意,这里这个“窥探( Peeking ) ”的动作只有在硬解析的时候才会执行,当使用了绑定变量的目标 sQL 再次执行时
(此时对应的是软解析/软软解析),即便此时对应绑定变量的具体输入值和之前硬解析时对应的值不同, Orade 也会沿用之前硬解析时所产生的解析树和执行计划,而不再重复执行上述“窥探”的动作。
        让 oracle 的表执行 DDL 再次执行目标 SQL 时使用硬解析的方法有很多,其中很常见的一种方法是对目标操作。因为一旦对某个表执行了 DDL 操作,库缓存中所有在 SQL 中所涉及 Cursor 都会被 oracle 标记为失效( invalid ) ,这意味着这些 Shared Cursor 被重用,所以当 Oracle 再次执行与这个表相关的 SQL 时就会使用硬解析 SQL 文本中包含了这个表的 Shared 中存储的解析树和执行计划将不再能重用,所以再执行目标SQL时就会使用硬解析。DDL 操作有很多种,通常会选择添加注释的 COMMENT 语句,因为使用 COMMENT 添加注释操作,但同时它的杀伤力和对生产环境的影响又微乎其微。
        使用 DBMS_SHARED POOL.PURGE 可以做到让Oracle只在执行目标SQL时进行硬解析。  DBMS_SHARED POOL.PURGE 是从 oracle 10 . 2 . 0 . 4 它可以用来删除指定的缓存在库缓存中的 Shared Cursor。  DBMS_SHARED POOL.PURGE  可以让 oracle 在执行目标 SQL 时使用硬解析的原理是显而易见的 ― 如果某个 SQL 对应的 Shared Cursor 被删除了, oracle 再次执行该 SQL 时自然就会使用硬解析。

绑定变量分级

         绑定变量分级( Bind Graduation )是指 oracle 在 PL / SQL 代码中会根据文本型绑定变量的定义长度而将这些文本型绑定变量分为四个等级。
    (1)定义长度在 32 字节( Byte )以内的文本型绑定变量被分在第一个等级。
    (2)定义长度在 33 一 128 字节之间的被分在第二个等级。
    (3)定义长度在 129 一 2 , 000 字节之间的文本型绑定变量被分在第三个等级。
    (4)定义长度在 2000 字节以上被分在第四个等级。
        在执行目标 SQL 时,对目标 SQL 中的每一个绑定变量 oracle 都要用其实际的值来替换,所以该 SQL 的 Session Cursor 必须为这些绑定变量在 PGA 中预留一定长度的内存,这个预留的内存空间必须能够容纳这些绑定变量实际的值。当然,这里最理想的方式就是预留的内存空间恰好等于这些绑定变量的定义长度,但这样一来 Orade 处理起来就会比较麻烦(因为绑定变量的定义长度千差万别)。为了简化处理流程, Oracle 就分了上述四个等级,这样一来,不管目标 SQL 中文本型的绑定变量的定义长度为多少, Oracle 只需要对不同等级的文本型绑定变量分别分配固定大小的内存空间就可以了。



你可能感兴趣的:(Oracle)