各位大侠,我的标题有点奇怪,请看后文。
在库履历data大约有250万记录,保存每天材料的入库数据,出库数据。在库数据也是每日保存的,但是不一定与入出库同步,比如,7/4的进行了入出库操作,但在库只做到7/2。
有一个view用来查询最近一次结算日的在库数据。
现在从view抽出符合条件的记录登陆到另一个表。一开始执行要花5分钟左右,很慢很慢。
过一段时,突然就变快了,20秒左右。
这段时间内,在库履历data没有新增记录,只做了一些查询,
另外还加了一个索引,但是又删除。
求高人解释原因,为什么会变快,怎么让这种变快一开始就有效啊?

解决方案 »

  1.   

    第一次查询的时候,首先检查database buffers中有没有符合条件的记录,如果没有的话从磁盘读取。
    你第二次查询的时候,是直接从database buffer中读取的,自然速度快了
      

  2.   

    补充一点:
    原始数据EXPDAT.DMP约2G左右,
    imp之后,给在库履历data加了一个索引,建立了上述view。
    就是测试数据。接下来的操作如帖子所描述的那样。
      

  3.   

    看下oracle的select查询原理就知道了
      

  4.   

    执行数次之后才能变快。
    之前:5分钟之后
    第一次:20秒
    第二次:5秒
    ......
    ALTER SYSTEM FLUSH BUFFER_CACHE
    清除缓存
    第N次:20秒
    第N+1次:5秒
      

  5.   

    ALTER SYSTEM FLUSH SHARED_POOL;
    ALTER SYSTEM FLUSH BUFFER_CACHE;
    执行后就变快了,求高人解释!
      

  6.   

    缓冲区的原因,20s→5s这个明白。从5分变到20s的原因呢?
    ALTER SYSTEM FLUSH SHARED_POOL;
    ALTER SYSTEM FLUSH BUFFER_CACHE;
    执行后就从5分变到20s。