变量绑定

1. 当一个用户与数据库建立起链接以后,会向数据库发出操作请求,一条或者多条sql语句,Oracle接收到sql之后,首先将这个sql做一个hash函数运算,得到一个hash值,然后到共享池中寻找是否有和这个hash值匹配的sql,如果找到,oracle将直接使用已经存在的sql的执行计划去执行当前的sql,然后将结果返回给用户。如果在共享池中没有找到相同hash值得sql,Oracle会认为这是一条新的sql,会按照下面的顺序来执行:

  1. 语法分析:查看sql是否符合Oracle规定的语法规则。
  2. 语义分析: 对sql做一些对象,权限方面检查,查看sql中操作的表是否存在,表中列是否正确,用户是否有操作这个对象的权限。
  3. 生成执行计划:查看操作对象统计信息,或者动态采样来生成执行计划。
  4. sql的执行:按照生成的执行计划执行sql并返回结果。

2. 硬分析hard parse(1-4)

  软分析soft parse(相同hash值得sql已经存在于共享池中)

3. 绑定变量本质就是把本来需要oracle硬分析的sql变成软分析,减少Oracle花费在sql解析上的时间和资源。也就是拿一个变量来代替谓词常量,让Oracle每次对用户发出的sql做hash运算时,运算出的结果都是同样的hash值。

select a from t where b='A' 绑定变量后就是:select a from t where b=:x;

4. OLTP必须要求绑定变量,OLAP不应该绑定变量:OLTP数据库要求内存命中率(buffer hit)越过越好,OLTP系统中sql语句大多是比较简单或者操作的结果集都很小,尽管操作的表可能非常大,但是操作的记录数可能只有1行或者几行,如果在这张表创建了索引,那么这种极小的结果集的操作使用索引最合适,在这种情况下,索引可能只需扫过几个数据块就可以定位到数据,而全表扫描会耗费更多资源,因此在这种情况下,即使每个用户的谓词条件不一样,执行计划也是一样的,就是统统使用索引来访问数据,几乎不大可能走全表扫描的情况,在这种执行计划几乎是唯一的情况下,使用变量来代替谓词常量,使用同一个执行计划是合适的。在OLAP系统中,大多时候运行的是一些报表sql,这些sql经常会用到聚合查询(比如group by),而且结果集也非常大,在这种情况下,索引不是必然的选择,甚至有的时候全表扫描性能会更优于索引,即使相同的sql,如果谓词条件不同,执行计划也可能不同。

  • 在OLAP系统中,sql硬分析的代价是可以忽略的,系统资源基本上时用来做大的sql查询,和查询比起来,解析消耗的资源微不足道。
  • 在OLAP系统中,让oracle确切的知道谓词的数值很重要,它直接决定sql执行计划的选择,这样做的方式就是不要绑定变量。
  • 在OLAP系统中,表,索引的分析至关重要,因为他是oracle为sql做出正确执行计划的信息来源和依据。所以需要建立一套能够满足系统要求的对对象分析的定时执行任务。

5. bind peaking:sql语句在硬分析的时候,oracle会看一下当前sql谓词的值,以便生成最佳的执行计划。变量的值不同,采用的执行计划也不同。它只发生在硬分析的时候,即第一次sql执行的时候,之后的变量不会再做peeking。

posted on 2014-05-17 17:16  当时已枉然  阅读(363)  评论(0编辑  收藏  举报