如何在 Oracle SQL 数据库中删除后删除 'wasted rows'

How to remove 'wasted rows' after delete in Oracle SQL database

在 Oracle sql 数据库中,我们系统中的一个进程从 table 中删除(未截断)大约 200 万行。这导致大量 'wasted rows' 导致对 table 的查询 运行 花费超过 9 小时,通常在 5 分钟内完成。经检查,我们发现实际行总数的大小约为 2600MB,而包括 'wasted rows' 在内的总体 table 的大小为 3700MB。

请告诉我删除行然后删除 'wasted rows' 的最佳方法是什么,这样我们就不必每次都重建 table。

让我们用一些数据

创建的测试table来模拟您的案例
create table tst as 
select 
rownum id, lpad('x',1000,'y') pad
from dual 
connect by level <= 100000;

table 由 15K 个块组成

select blocks from user_segments
where segment_name = 'TST';

    BLOCKS
----------
     15360 

如果我们删除所有行,table 大小保持不变

delete from tst;
commit;

select blocks from user_segments
where segment_name = 'TST';

    BLOCKS
----------
     15360 

重组 table 后,table 大小会随着空闲 space 的删除而减小。

alter table tst MOVE;  

select blocks from user_segments
where segment_name = 'TST';

    BLOCKS
----------
         8 

请注意,此步骤需要应用程序停机,重组内不允许更改。

从 Oracle 12.2 开始,您可以执行此步骤 ONLINE

免费 space 应该不会对您的表现产生太大影响。 相反,我怀疑您的统计数据可能已过时。您是否尝试过在删除操作后收集统计信息?