delete2万条数据速度慢的原因

[复制链接]
查看11 | 回复9 | 2007-9-26 18:42:10 | 显示全部楼层 |阅读模式
2万条数据delete要31秒,而同样insert2万条数据只须7秒,问:为什么delete要慢这么多?以下为delete和insert代码,请大虾帮我分析为什么delete要比insert慢这么多?
1.删除语句
DELETE FROM fnc_container_activities_temp
Where cac_cda_apid=i_apid;
IF sql %NOTFOUND THEN
NULL;
END IF;

DELETE FROM fnc_container_act_bak_temp
where cac_cda_apid=i_apid;
If sql%notfound Then
null;
end if;

DELETE FROM fnc_container_data_temp
WHERE
cda_apid=i_apid;
IF sql %NOTFOUND THEN
NULL;
END IF;

DELETE FROM fnc_groupfee_data_temp t
WHERE
gfd_apid =i_apid;
IF sql %NOTFOUND THEN
NULL;
END IF;
2.插入语句
begin
insert into fnc_container_data_temp(cda_apid,cda_ieid,cda_cstmcd,cda_cntrid,

cda_cntrno,cda_middle_ship,cda_in_termcd,cda_out_termcd,

cda_fbus_termcd,cda_sbus_termcd,

cda_fbus_ieid,cda_sbus_ieid,cda_copercd,cda_vescorp_code,

cda_ccr_cstmcd,cda_fe,cda_ie,cda_size,cda_goodstype,

cda_standard,cda_ldport,cda_unldport,cda_dstnport

,cda_trade)
select 1,cnt_sdlb_id,nvl(fa_fun_wbq_hbcode(cnt_hb_id),'MSKL'),t.cnt_id,t.cnt_cntno,
decode(t.CNT_CSLOADMA_ID,null,'N','Y'),
fa_fun_getshdock_code(CNT_UNLOADVYGMA),
fa_fun_getshdock_code(CNT_LOADVYGMA),
fa_fun_getshdock_code(CNT_CSLOADMA_ID),
fa_fun_getshdock_code(CNT_CSUNLOADMA_ID),
cnt_cs_vyg_id,
cnt_csunloading_vyg_id,
fa_fun_wbq_hbcode(cnt_hb_id),
fa_fun_wbq_op(cnt_ci_id),
fa_fun_wbq_op(cnt_dcr_id),
fa_fun_getctnef(CNT_EF),
FA_FUN_GETCTNEI(CNT_EF),
cnt_cs_id,
decode(cnt_ct_id,5,'R',decode(CNT_DC_ID,null,'D','G')),
'Y'
,CNT_LDPORT,
CNT_DSTPORT,
CNT_DSTPORT
,decode(fa_fun_getctntrade(cnt_ef),1,'RG',2,'RT',3,'RI',4,'TM',

5,'RN',6,'NT',7,'GL',8,'RL',9,'UT',10,'CD')
from fa_tbl_container t
where cnt_sdlb_id=10065 ;
cnt_vyg_id in (177689,179247,169455,175757,169218,172628,168213,173039,180379,180359,175909,170985);
cnt_vyg_id in (182608,174768,174685,175866,180435,170050,171219,174467,174475,173114,176288,173482,178384);
fnc_s_gen_data_p(1,null);
commit;
end;
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
delete 本身就比insert into 慢
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
删除的操作并不慢,速度基本上是由delete的时候where后面的条件语句决定的
DELETE FROM fnc_container_activities_temp
Where cac_cda_apid=i_apid;
IF sql %NOTFOUND THEN
NULL;
END IF;
每条删除都要一个查询的啊!
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
CREATE TABLE FNC_CONTAINER_ACTIVITIES_TEMP
(
CAC_CDA_APID NUMBER(9)
NOT NULL,
CAC_CDA_CNTRID NUMBER(9)
NOT NULL,
CAC_TERMCD VARCHAR2(10 BYTE),
CAC_INTIME DATE,
CAC_OUTTIMEDATE,
CAC_JFDAYS NUMBER(10),
CAC_LDUNLD_FLAGVARCHAR2(1 BYTE),
CAC_BUS_FLAG VARCHAR2(1 BYTE)
)
TABLESPACE SCTFA
PCTUSED0
PCTFREE10
INITRANS 1
MAXTRANS 255
STORAGE(

INITIAL
64K

NEXT
1M

MINEXTENTS 1

MAXEXTENTS 2147483645

PCTINCREASE0

BUFFER_POOLDEFAULT
)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;
FNC_CONTAINER_ACTIVITIES_TEMP的scripts:
ALTER TABLE FNC_CONTAINER_ACTIVITIES_TEMP ADD (
CONSTRAINT CAC_CDA_FK
FOREIGN KEY (CAC_CDA_APID, CAC_CDA_CNTRID)
REFERENCES FNC_CONTAINER_DATA_TEMP (CDA_APID,CDA_CNTRID));
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
FNC_CONTAINER_ACT_BAK_TEMP的scripts:
CREATE TABLE FNC_CONTAINER_ACT_BAK_TEMP
(
CAC_CDA_APID NUMBER(9)
NOT NULL,
CAC_CDA_CNTRID NUMBER(9)
NOT NULL,
CAC_TERMCD VARCHAR2(10 BYTE),
CAC_INTIME DATE,
CAC_OUTTIMEDATE,
CAC_JFDAYS NUMBER(10),
CAC_LDUNLD_FLAGVARCHAR2(1 BYTE),
CAC_BUS_FLAG VARCHAR2(1 BYTE),
CAC_ACT_ID NUMBER(9),
CAC_GEN_TYPE VARCHAR2(1 BYTE)
)
TABLESPACE SCTFA
PCTUSED0
PCTFREE10
INITRANS 1
MAXTRANS 255
STORAGE(

INITIAL
64K

NEXT
1M

MINEXTENTS 1

MAXEXTENTS 2147483645

PCTINCREASE0

BUFFER_POOLDEFAULT
)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;
COMMENT ON COLUMN FNC_CONTAINER_ACT_BAK_TEMP.CAC_GEN_TYPE IS 'I:两条进场动态O:无进场动态有出场动态';
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
FNC_CONTAINER_DATA_TEMP的scripts:
CREATE TABLE FNC_CONTAINER_DATA_TEMP
(
CDA_APID
NUMBER(9)
NOT NULL,
CDA_IEID
NUMBER(9),
CDA_CSTMCDVARCHAR2(8 BYTE)
NOT NULL,
CDA_CNTRIDNUMBER(9)
NOT NULL,
CDA_CNTRNOVARCHAR2(11 BYTE) NOT NULL,
CDA_IE
VARCHAR2(1 BYTE),
CDA_SIZE
VARCHAR2(1 BYTE),
CDA_GOODSTYPE VARCHAR2(6 BYTE),
CDA_STANDARDVARCHAR2(1 BYTE),
CDA_FE
VARCHAR2(1 BYTE),
CDA_TRADE VARCHAR2(2 BYTE),
CDA_VESCORP_CODEVARCHAR2(8 BYTE),
CDA_CCR_CSTMCDVARCHAR2(8 BYTE),
CDA_COPERCD VARCHAR2(10 BYTE),
CDA_FIEID NUMBER(9),
CDA_SIEID NUMBER(9),
CDA_LNE_RTCDVARCHAR2(20 BYTE),
CDA_FLNE_RTCD VARCHAR2(20 BYTE),
CDA_SLNE_RTCD VARCHAR2(20 BYTE),
CDA_MIDDLE_SHIP VARCHAR2(1 BYTE),
CDA_FBUS_IEID NUMBER(9),
CDA_SBUS_IEID NUMBER(9),
CDA_IN_TERMCD VARCHAR2(10 BYTE),
CDA_OUT_TERMCDVARCHAR2(10 BYTE),
CDA_FBUS_TERMCD VARCHAR2(10 BYTE),
CDA_SBUS_TERMCD VARCHAR2(10 BYTE),
CDA_LDPORTVARCHAR2(5 BYTE),
CDA_UNLDPORTVARCHAR2(5 BYTE),
CDA_DSNTPORTVARCHAR2(5 BYTE),
CDA_OVLMTCD VARCHAR2(2 BYTE),
CDA_DNGCD VARCHAR2(4 BYTE),
CDA_CTYPECD VARCHAR2(2 BYTE),
CDA_STTMPTVARCHAR2(5 BYTE),
CDA_STOREDAYS NUMBER(10),
CDA_LINETYPEVARCHAR2(5 BYTE),
CDA_SHIPTYPEVARCHAR2(5 BYTE),
CDA_INTYPEVARCHAR2(5 BYTE),
CDA_STE_IDNUMBER(9),
CDA_YS_FLAG VARCHAR2(1 BYTE)
)
TABLESPACE SCTFA
PCTUSED0
PCTFREE10
INITRANS 1
MAXTRANS 255
STORAGE(

INITIAL
64K

NEXT
1M

MINEXTENTS 1

MAXEXTENTS 2147483645

PCTINCREASE0

BUFFER_POOLDEFAULT
)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;

CREATE INDEX CDA_I1 ON FNC_CONTAINER_DATA_TEMP
(CDA_APID)
LOGGING
TABLESPACE SCTFA
PCTFREE10
INITRANS 2
MAXTRANS 255
STORAGE(

INITIAL
1M

NEXT
1M

MINEXTENTS 1

MAXEXTENTS 2147483645

PCTINCREASE0

BUFFER_POOLDEFAULT
)
NOPARALLEL;

CREATE UNIQUE INDEX CDA_PK ON FNC_CONTAINER_DATA_TEMP
(CDA_APID, CDA_CNTRID)
LOGGING
TABLESPACE SCTFA
PCTFREE10
INITRANS 2
MAXTRANS 255
STORAGE(

INITIAL
1M

NEXT
1M

MINEXTENTS 1

MAXEXTENTS 2147483645

PCTINCREASE0

BUFFER_POOLDEFAULT
)
NOPARALLEL;

CREATE OR REPLACE TRIGGER fnc_s_cda_t
BEFORE INSERT
ON FNC_CONTAINER_DATA_TEMP
FOR EACH ROW
begin
DECLARE
v_storedays number(10);
BEGIN
fnc_s_insert_acttempby_p(:new.cda_apid,:new.cda_cntrid,
:new.cda_fbus_ieid,:new.cda_sbus_ieid,v_storedays);
:new.cda_storedays := v_storedays;
END;
END;
/
SHOW ERRORS;

ALTER TABLE FNC_CONTAINER_DATA_TEMP ADD (
CONSTRAINT CDA_PK
PRIMARY KEY
(CDA_APID, CDA_CNTRID)
USING INDEX
TABLESPACE SCTFA
PCTFREE10
INITRANS 2
MAXTRANS 255
STORAGE(

INITIAL
1M

NEXT
1M

MINEXTENTS 1

MAXEXTENTS 2147483645

PCTINCREASE0

));
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
最初由 wa0362 发布
[B]删除的操作并不慢,速度基本上是由delete的时候where后面的条件语句决定的
DELETE FROM fnc_container_activities_temp
Where cac_cda_apid=i_apid;
IF sql %NOTFOUND THEN
NULL;
END IF;
每条删除都要一个查询的啊! [/B]

怎么提高删除速度呢?能不能给我说下,谢谢了。
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
没有啊,建议你分期分批的定时删除,这样既提高了每次的速度还减少了每日增加的归档日志文件数(针对archivelog模式)。
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
看看能不能做分区表,定时truncate,truncate不产生回滚日志,会快很多
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
谢谢各位,我对每小部分进行了测试发现:delete from fnc_container_data_temp耗时3秒,但是数据其实只有769条。我下一部应该怎么分析呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行