删除 40 万行后表大小不受影响

use*_*er1 1 oracle

当我运行以下查询时 select bytes/1024/1024,segment_name,owner from dba_segments where tablespace_name='DATA_L1' and segment_name='Step_Status';

我得到了一个名为“Step_Status”的表的段的以下结果

BYTES/1024/1024         SEGMENT_NAME                OWNER
-----------------------------------------------------------------
 3192                    STEP_STATUS                FLSTD04
Run Code Online (Sandbox Code Playgroud)

它有大约 1800 万个条目

select count(*) from flstd04.step_status;

  COUNT(*)
----------
  18178090
Run Code Online (Sandbox Code Playgroud)

删除近 400 万条条目后

select count(*) from flstd04.step_status;

  COUNT(*)
----------
  14114186
Run Code Online (Sandbox Code Playgroud)

当我再次使用 dba_segments 检查表的大小时,我得到了相同的结果

select bytes/1024/1024,segment_name,owner from dba_segments where tablespace_name='DATA_L1' and segment_name='Step_Status';

  BYTES/1024/1024         SEGMENT_NAME                OWNER
    -----------------------------------------------------------------
   3192                    STEP_STATUS                FLSTD04
Run Code Online (Sandbox Code Playgroud)

为什么即使删除了400万行,表的大小还是一样?

Jus*_*ave 6

删除数据不会改变表段的大小。它将在属于表段的块中创建可用空间,并且可能会创建至少几个空块。该可用空间将可用于insert表上的后续操作(假设您正在执行常规路径插入)以及update导致行大小增加的操作。

如果您想实际缩小表段的大小(如果您将来只是打算向该表中插入更多数据,则通常不是一个好主意),这取决于 Oracle 版本、表空间的类型以及您是否已启用行移动,您可能可以缩小该段

ALTER TABLE step_status
  SHRINK SPACE CASCADE;
Run Code Online (Sandbox Code Playgroud)

但是,请注意,这可能是一项成本非常高的操作,可能涉及物理移动表中的大部分或所有行。

数据库管理员指南中有一个关于回收浪费空间的章节,更深入地讨论了这个问题和相关问题。它还演示了如何使用企业管理器 GUI 和各种顾问手动或自动回收空间。