【问题标题】:How to remove 'wasted rows' after delete in Oracle SQL database在 Oracle SQL 数据库中删除后如何删除“浪费的行”
【发布时间】:2020-03-12 22:20:59
【问题描述】:

在 Oracle sql 数据库中,我们系统中的一个进程从表中删除(未截断)大约 200 万行。这导致大量“浪费的行”导致在该表上运行的查询需要超过 9 个小时,通常在 5 分钟内结束。经过检查,我们发现实际行数的大小约为 2600MB,而包括“浪费的行”在内的整个表的大小为 3700MB。

请让我知道删除行然后摆脱“浪费的行”的最佳方法是什么,这样我们就不必每次都重建表。

【问题讨论】:

  • 从技术上讲,这不是wasted rows,而是一个可以在进一步插入中重复使用的可用空间。您可以通过使用ALTER TABLE xxx MOVE 重新组织表来回收此空间。根据您对查询行为的描述,我建议进一步调查execution plan,因为除了可用空间之外,它很可能还有其他问题。

标签: sql oracle sql-delete purge


【解决方案1】:

可用空间不会对您的性能产​​生太大影响。 相反,我怀疑您的统计数据可能已过时。您是否尝试在删除操作后收集统计信息?

【讨论】:

  • 是的,我们确实收集了统计数据,即使在那之后,获取查询的性能也没有太大差异。
【解决方案2】:

让我们用一些数据创建的测试表来模拟你的案例

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开始你可以做这一步ONLINE

【讨论】:

  • 谢谢。只有一个问题 - 这个“MOVE”是否适用于 10g 数据库?
  • 是的,您可以在Oracle 10g documentation找到详细信息
  • 谢谢。我已经尝试过了,它有效。感谢您的帮助。
猜你喜欢
  • 2015-04-08
  • 1970-01-01
  • 2012-02-11
  • 2015-10-31
  • 2014-05-09
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
相关资源
最近更新 更多