oracle分批删除效率很慢

oracle分批删除效率很慢,第1张

callendtime的索引是否是分区前缀索引

是否可以考虑月度分区后再进行一个list分区1~31分别表示日期(可以通过分区drop实现快速的删除)*但需要注意该表的插入性能影响

判断是否没有可删除的方式可以修改为使用%ROWCOUNT方式,不需要使用select 1 into方式。这样可以提高效率

因为delete过后是不移动HW的,而Oracle进行全表扫描时,是需要读取HW以前的全部块的,即使是空块也要扫描,举例来说,原来你的表是这样的,每个字母代表一个块,D是数据,H是HW标记,F是空块,此时全表扫描是读所有的D块

DDDDDDDDDDHFFFFFFFFFFF

当你delete删除时,H是不移动的

DDFFFFFFFFFHFFFFFFFFFFF

此时H前的D和F都要扫描,你需要收缩表移动HW,变成这样

DDHFFFFFFFFFFFFFFFFFFFF

这样它只扫描两个D

所以你要收缩一下你的表,移动HW

先允许表能够row movement

alter table wpt_log enable row movement

再收缩,

alter table wpt_log shrink space

收缩完后,最好给这表做一次统计分析

exec dbms_stats.gather_table_stats(user,'WPT_LOG',cascade=>true)

如果需要删除表中所有数据,建议用truncate,它可以将HW移动到表头

HFFFFFFFFFFFFFFFFFFFFFF

再插入数据时,HW会按照你填充块自动顺序移动

还有,如果你做开发,下面sql是不合适的,尽量不要在表列上加函数(执行用15秒,因为它是并发的)

select * from tablename where to_char(op_time,'yyyymmdd')='20131002'

如果op_time保存时所有行都没有带时间,上面sql可以改为:

select * from tablename where op_time=to_date('20131002','yyyymmdd')

如果在op_time上有个索引,那么上面sql可能会走索引


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6622142.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-25
下一篇 2023-03-25

发表评论

登录后才能评论

评论列表(0条)

保存