写了个存储过程运行,第一次运行要一段时间,但是以后运行就只要几秒时间,很奇怪,数据量在上百万。还有谁知道其中的原因?

解决方案 »

  1.   


    过程中SQL语句读取的数据可能来自第一次的cache中,因此比物理读取数据更快
    属于软解析的问题
      

  2.   

    没注意过,gelyon写的很有道理,学习了:)接分,今天又积累了点知识
      

  3.   

    oracle里面SGA里面分为shared pool,DB Buffers cache,redo log buffers.其中,shared pool里面分为library cache和dictionary cache.
    第一次运行存储过程的时候,需要时间进行解析,并把解析后的执行计划放到library cache里面.以后,你再执行存储过程的时候,oracle会在library cache里面去找是否有相同的执行计划.如果有的话,直接使用.不同的话,重新解析.注:上面所说就是存储过程传递参数的机制,使得解析后的执行计划是相同的.如果没有传递参数机制的话,如
    select * from a where conditionA 和 select * from a where conditionB,这二句的执行计划就是不同的,需要重新parse
      

  4.   

    软解析是一方面,另一方面是由于命中率提高了,因为你第一次执行存储过程,将数据从磁盘读入内存,修改数据后,如果内存足够的话,DBWR并不会马上把数据写入到磁盘,而是保留在内存中,当你再次执行时,不需要再从磁盘读取数据(或者说从磁盘读取的数据只是较小一部分),而是直接对内存中数据进行修改,所以速度明显提高了。
      

  5.   

    是因为 内存区 SGA保存了你的存储过程解析 还有部分数据的原因