如何在 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 应该不会对您的表现产生太大影响。
相反,我怀疑您的统计数据可能已过时。您是否尝试过在删除操作后收集统计信息?
在 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 应该不会对您的表现产生太大影响。 相反,我怀疑您的统计数据可能已过时。您是否尝试过在删除操作后收集统计信息?