在存储过程中动态拼写一条sql语句,执行
表2的数据量大约是800w
n_sql :='insert into 表1 select * from 表2';
execute immediate;
执行大约80分钟,有时也要30分钟但是自己在窗口执行
insert into 表1 select * from 表2
执行时间大约2分钟
怎么会差距那么多啊

解决方案 »

  1.   

    动态sql  是在执行的时候才去解析。
    每次执行时,都执行一次语法语义的解析,应该会影响速度。
      

  2.   

    在窗口执行
    insert into 表1 select * from 表2
    也是需要解析吧
      

  3.   

    使用你的存储过程,执行以下,看看需要多长时间。
    如果时间也是很长,那表示可能存储过程的问题。
    如果时间没有很长,那表示可能是job调度的问题。存储过程的问题,可以debug一下,看一下存储过程中哪里消耗的时间比较长。
    job调度的问题,可以动态监控一下job的调用情况,查看一下user_jobs视图,或者更细粒度的在job的what中加上alter session set sql_trace 查看一下trace信息(笔者没实验过)。