在一个存储过程中,我用到了批量插入
就是insert int A select  a from b 这种样子的
注意一点的是,这个批量插入的sql是动态sql,
我先拼出来的,然后用execute immediate来执行这个sql

在执行存储过程中很慢
但是我把这个sql语句取出来
拿到pl/sql中来单独执行
速度马上就上去了简单一句话,同一个sql在存储过程中很慢
但是在pl/sql中则很快请问这可能是什么原因造成的?
如何获取该条sql执行的时候的执行计划?

解决方案 »

  1.   

    这个问题一直都有人问,没有什么好的解决方法,你改成 insert /*+ append */ into  试试
      

  2.   

    1、在SQL窗口查看一下执行计划,然后在动态SQL中加上提示。
    2、使用批量直接路径插入(归档模式使用nologging)可以减少undo及redo生成量
    insert /*+ append */ into A nologging select * from b;
      

  3.   

    DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION
    用这个.
    具体怎么使用Google一下吧.
      

  4.   

    insert /*+ append */ into A select a from b
      

  5.   

    多谢各位捧场
    我用了insert /*+ append */ into A select a from b
    但是速度还是慢虽然各位说了很多
    但是还是没有说到怎么在执行存储过程中查找它的执行计划
    这才是我最关心的谢谢hailang1118
    你这个建议,我正在试
      

  6.   


    恩,分开并行插入,质量会提高很多,建议不开始REDO OR UNDO文件,增加数据插入效率。。
    tangren大大:
    insert /*+ append */ into A nologging select * from b  --  这句不能实现NOLOGGING ,我查了基本所有的ORACLE的官方文件,都没有NOLOGGING的写法,而表的UNLOGGING默认是取决于DATASPACE,当然也可以手动的修改表的NOLOGGING。 ALTER TABLE ...  OR CREAT TABLE... 时进行NOLOGGING的修改。
    不足之处望回答。。
      

  7.   


    你加个步骤
    alter table a nologging
      

  8.   

    还是把在pl/sql中的执行计划亮出来吧
    请问,我该如何写hints
    让动态sql的执行计划和这个在pl/sql中的执行计划保持一致?
      

  9.   

    我自己在V$SQL_PLAN里找到了的执行计划方法很简单就是先在V$SQLAREA中找到这个SQL,然后得到SQL_ID,去V$SQL_PLAN去看它执行的计划
    示例如下:先根据sql语句查找sql_id
    select *
      from V$SQLAREA sr
     where sr.SQL_TEXT like 'INSERT INTO T_BILLINVOICEDETAIL%'
     order by sr.FIRST_LOAD_TIME desc;--再根据sql_id查找执行计划
    select * from V$SQL_PLAN pa where pa.SQL_ID = '6c8y8nuysajcf';
    或者下面这个更直观些:select '--------------------------------------------------------------------------------'
      from dual
    union all
    select '| Operation | PHV/Object Name | Rows | Bytes| Cost |' as "Optimizer Plan:"
      from dual
    union all
    select '--------------------------------------------------------------------------------'
      from dual
    union all
    select *
      from (select rpad('|' || substr(lpad(' ', 1 * (depth - 1)) || operation ||
                                      decode(options, null, '', ' ' || options),
                                      1,
                                      62),
                        63,
                        ' ') || '|' ||
                   rpad(decode(id,
                               0,
                               '----- ' || to_char(hash_value) || ' -----',
                               substr(decode(substr(object_name, 1, 7),
                                             'SYS_LE_',
                                             null,
                                             object_name) || ' ',
                                      1,
                                      20)),
                        21,
                        ' ') || '|' ||
                   lpad(decode(cardinality,
                               null,
                               ' ',
                               decode(sign(cardinality - 10000),
                                      -1,
                                      cardinality || ' ',
                                      decode(sign(cardinality - 1000000),
                                             -1,
                                             trunc(cardinality / 1000) || 'K',
                                             decode(sign(cardinality - 1000000000),
                                                    -1,
                                                    trunc(cardinality / 1000000) || 'M',
                                                    trunc(cardinality / 1000000000) || 'G')))),
                        7,
                        ' ') || '|' ||
                   lpad(decode(bytes,
                               null,
                               ' ',
                               decode(sign(bytes - 1024),
                                      -1,
                                      bytes || ' ',
                                      decode(sign(bytes - 1048576),
                                             -1,
                                             trunc(bytes / 1024) || 'K',
                                             decode(sign(bytes - 1073741824),
                                                    -1,
                                                    trunc(bytes / 1048576) || 'M',
                                                    trunc(bytes / 1073741824) || 'G')))),
                        6,
                        ' ') || '|' ||
                   lpad(decode(cost,
                               null,
                               ' ',
                               decode(sign(cost - 10000000),
                                      -1,
                                      cost || ' ',
                                      decode(sign(cost - 1000000000),
                                             -1,
                                             trunc(cost / 1000000) || 'M',
                                             trunc(cost / 1000000000) || 'G'))),
                        8,
                        ' ') || '|' as "Explain plan"
              from v$sql_plan
             where SQL_ID='6c8y8nuysajcf')
    union all
    select '--------------------------------------------------------------------------------'
      from dual;
    至于如何强迫变更执行计划,再继续探索!