开发者社区 问答 正文

在Oracle SQL数据库中删除后如何删除“浪费的行”

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

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

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-18 11:43:15 510 分享 版权
1 条回答
写回答
取消 提交回答
  • 让我们用一些数据创建的测试表来模拟您的案例

    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开始,您可以在线执行此步骤

    2019-11-18 11:43:26
    赞同 展开评论