我有一张表 A,此表有几个索引,有一个字段ID,是用sequence触发器实现自增的。我在PLSQL中执行Insert into A Select * from B 的速度大概是3秒,在存储过程中执行需要90秒。我执行的是同样的SQL语句,存储过程中没有参数。后来我发现将表的触发器去掉的话,那么存储过程中他执行的速度也会非常快。请问有高手知道为什么在PLSQL中执行很快,存储过程中很慢吗?难道不能在存储过程中插入数据到有触发器
的表吗?
的表吗?
/* 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
);
-- 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;
你说执行计划有改变,这个有可能,但是我再另一个数据库中测试的语句就是
Insert into A select * from B,没有条件的,难道这样还有执行计划费时之说吗?
如果插入的数据量几百条无所谓,如果过万的记录就会比较慢,得一分钟以上。但是为什么在PLSQL中为什么没事我就找不到原因了。
触发器是耗时。
我用我开发的程序去调用这个存储过程就非常快,
应该是调试的原因吧,我在PLSQL中用的是测试,所以慢吧。
谢谢回答了。结贴吧。