在Oracle sql数据库中,我们系统中的一个进程从一个表中删除(未截断)大约200万行。这导致大量“浪费的行”,导致在该表上运行的查询花费9个小时以上的时间,通常要花5分钟以上的时间。经过检查,我们发现实际行的总数约为2600MB,而包括“浪费的行”在内的整个表的大小为3700MB。
请让我知道什么是删除行然后摆脱“浪费的行”的最佳方法,这样我们就不必每次都重新构建表。
问题来源于stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
让我们用一些数据创建的测试表来模拟您的案例
create table tst as select rownum id, lpad('x',1000,'y') pad from dual connect by level <= 100000; 该表由15K块组成
select blocks from user_segments where segment_name = 'TST';
BLOCKS
15360
如果我们删除所有行,则表大小保持不变
delete from tst; commit;
select blocks from user_segments where segment_name = 'TST';
BLOCKS
15360
重组表后,表的大小会随着可用空间的删除而减小。
alter table tst MOVE;
select blocks from user_segments where segment_name = 'TST';
BLOCKS
8
请注意,此步骤需要关闭应用程序,重组中不允许进行任何更改。
从Oracle 12.2开始,您可以在线执行此步骤