大量删除数据后,Oracle性能下降 你delete后,产生了大量碎片,insert慢就正常了删1/3数据,可以不用delete啊,搞个临时表性能可能会更好 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 导入时到全局零时表里边,然后去重复杀入到正式表中。若一次性数据,还可以这样,现将数据复制到一个临时表中,然后对原表进行TRUNCATE table 操作,然后将数据弄回来。 这样表中的碎片就消失了。 如果不是特别忙的环境,并且晚上可以停机1小时左右,可以考虑先CTAS、truncate、insert select 、再收集统计信息。四步手工执行,分开来做,不建议脚本自动化。 通过delete删除大量数据后,其实高水位线还是没有下降。于是在insert时,需要在高水位线下,来查找空闲空间来插入数据,这个肯定需要更长的时间。可以收缩表:alter table xxx shrink space不过由于这个操作会锁表,所以最好在维护期间进行操作,而不是在业务高峰期进行操作。 在收缩表前,还必须要启动行移动:alter table xxx enable row movement;然后:alter table xxx shrink space; 表中记录被删除后,索引中对应的键值不会被删除(即所占用空间不会释放),而只是加上删除标记。如果以后有新的键值(一个或多个)加进这个数据块,则块中标记删除的键值都会清除。所以你在删除操作后做一下索引重建,然后再做一下碎片整理,否则以后每次操作都有多余的步骤在执行,比如看rowid是否重复,要删除等等多余的操作。 重建索引 alter <index 名字> rebuild;手工收集单表统计信息: EXEC DBMS_STATS.gather_table_stats('<table owner>', '<table_name>'); 求助proc中是不是不可以用left join? 求每年最小月份的金额合计和最大月份金额合计 用户的oracle的alert日志里发现个问题,大家帮忙看看 数据库 小项目 求助 trigger的问题 求一条复杂SQL写法 刚才误删了表中的数据,请问有什么方法可以快捷的恢复数据? sql*plus中的字段显示时是列向的,怎样改成横向啊? 如何启动数据库的监听程序?? 初试pl developer,怎么无法使用insert into语句? sql developer 无法连接 oracle安装失败
所以你在删除操作后做一下索引重建,然后再做一下碎片整理,否则以后每次操作都有多余的步骤在执行,比如看rowid是否重复,要删除等等多余的操作。
手工收集单表统计信息: EXEC DBMS_STATS.gather_table_stats('<table owner>', '<table_name>');