我有一张表 A,此表有几个索引,有一个字段ID,是用sequence触发器实现自增的。我在PLSQL中执行Insert into A Select * from B 的速度大概是3秒,在存储过程中执行需要90秒。我执行的是同样的SQL语句,存储过程中没有参数。后来我发现将表的触发器去掉的话,那么存储过程中他执行的速度也会非常快。请问有高手知道为什么在PLSQL中执行很快,存储过程中很慢吗?难道不能在存储过程中插入数据到有触发器
的表吗?

解决方案 »

  1.   

    表定义如下/*==============================================================*/
    /* Table: t_security_position                                   */
    /*==============================================================*/
    create table t_security_position  (
       ID                   number(10)                      not null,
       L_DATE               varchar2(10),
       L_FUND_ID            varchar2(6),
       L_TYPE               varchar2(20),
       VC_CODE              varchar2(20),
       YWLB                 varchar2(6),
       VC_REPORT_CODE       varchar2(20),
       C_MARKET_NO          varchar2(20),
       WFSY                 NUMBER(23,4),
       ZQCC                 NUMBER(23,4),
       ZQQY                 NUMBER(23,4),
       FEQY                 NUMBER(23,4),
       constraint PK_T_SECURITY_POSITION primary key (ID)
    );/*==============================================================*/
    /* Index: i_security_position_date                              */
    /*==============================================================*/
    create index i_security_position_date on t_security_position (
       L_DATE ASC
    );/*==============================================================*/
    /* Index: i_security_position_vc_code                           */
    /*==============================================================*/
    create index i_security_position_vc_code on t_security_position (
       VC_CODE ASC
    );/*==============================================================*/
    /* Index: i_security_position_fundid                            */
    /*==============================================================*/
    create index i_security_position_fundid on t_security_position (
       L_FUND_ID ASC
    );
      

  2.   

    触发器
    -- Create sequence 
    create sequence SEQ_DOUDI
    minvalue 1
    maxvalue 999999999999999999999999999
    start with 69316961
    increment by 1
    cache 20;Create Or Replace Trigger tri_security_position
      Before Insert On t_security_position For Each Row 
    Begin
      Select seq_doudi.nextval into :New.id from dual;
    end;
      

  3.   

    sql语句完全一样,我故意弄的存储过程里也没有参数
      

  4.   

    建议 在 存储过程里面 捕获 sql的执行计划,和你单独运行sql的执行计划是否一样我感觉这种问题,就是执行计划有改变,虽然sql是一致的。
      

  5.   

    我还怀疑是不是我数据库出问题了,我又换了一个数据库,结果还是一样。
    你说执行计划有改变,这个有可能,但是我再另一个数据库中测试的语句就是
    Insert into A select * from B,没有条件的,难道这样还有执行计划费时之说吗?
      

  6.   

    我目前得出的结论就是在存储过程中如果执行 Insert 语句,如果表有触发器,就会非常慢,最好只能禁止,
    如果插入的数据量几百条无所谓,如果过万的记录就会比较慢,得一分钟以上。但是为什么在PLSQL中为什么没事我就找不到原因了。
      

  7.   

    哈哈,我找见原因了。
    触发器是耗时。
    我用我开发的程序去调用这个存储过程就非常快,
    应该是调试的原因吧,我在PLSQL中用的是测试,所以慢吧。
    谢谢回答了。结贴吧。