简述”parse calls”

本文翻译自Jonathan Lewis的Blog Entry Nutshell – 2

简述”parse calls”
By Jonathan Lewis, Translated By Jametong
关于统计信息”parse calls”的涵义,市面上流传着大量的含糊的说法.记住下面这一点很重要,这个统计项仅仅统计OCI库一种特定类型的调用(Call),一次parse call需要的工作量随着情境的不同可能会产生相差很大,有时它所做的工作量非常小,从而可以不用担心.

一次”parse calls”可能:

  • a) 不得不优化这条SQL语句,因为它无法在库缓存(Library Cache)中找到匹配项.
  • b) 在库缓存中找到了对应的语句,但是仍然由于各种原因需要对其进行优化,例如:之前的执行计划已经被刷出内存,或者由于不同的用户在调用,同样的SQL文本应用到了不同的对象.
  • (a),(b)是我们一般意义上理解的hasd parse

  • c) 在库缓存中找到了对应的SQL语句,并且不需要对其进行优化,因为它的执行计划仍然存在,并且用户也有相应的权限.
  • 这一条是我们一般意义上理解的soft parse

  • d) 当通过session cursor cachepl/sql cursor cache操作时,可以直接找到语句在库缓存中的位置,从而完全不需要搜索库缓存.
  • 这一条是我们一般理解的soft soft parse (最初应该来自于Asktom的叙述)

    当Oracle增加”parse calls”的计数器时,你仍然需要搞清楚这次调用到底对应于(a),(b),(c),(d)中的哪一类调用.
    或许只是为了混淆问题,Oracle也可能仅仅记录一次”parse count(hard)”而不记录”parse call.

    No related posts.

    5 comments to 简述”parse calls”

    • soft soft parse, Craig 称之为softer parse.

    • 鄙人不清楚什么是PL/SQL cursor cache.

      session cursor cache和PL/SQL存储过程里面的cursor还是不同的.

      被session cursor cache缓存的cursor, 还需要在?里面进行一次定位(Locate),消耗CPU, 但不需要Latch/Mutex, 自然串行.
      “?”表示具体Shared_pool(或者PGA)里面的一块区域,鄙人还没最后搞清楚.

      PL/SQL存储过程里面的cursor不会被close, 是100%的parse once, execute many.
      JDBC里面需要启用Statement Cache, 来解决这个问题.

    • session cursor cache 在使用的时候, 分几种情况,
      前面三次并不是表现为cache hit,但是还是需要做semantics check (authentication), 只有在三次以上时才不需要再做authentication.

      到11g之后,,plsql cursor cache也依赖于session cursor cache了,,之前是完全在pga里面的..

    • 鄙人依然一头雾水,越深入,越混乱.

      希望您有空写一篇文章给专门解释一下cursor的各种状态和使用机制.

    Leave a Reply

     

     

     

    You can use these HTML tags

    <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>