当我运行以下查询时
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万行,表的大小还是一样?
删除数据不会改变表段的大小。它将在属于表段的块中创建可用空间,并且可能会创建至少几个空块。该可用空间将可用于insert
表上的后续操作(假设您正在执行常规路径插入)以及update
导致行大小增加的操作。
如果您想实际缩小表段的大小(如果您将来只是打算向该表中插入更多数据,则通常不是一个好主意),这取决于 Oracle 版本、表空间的类型以及您是否已启用行移动,您可能可以缩小该段
ALTER TABLE step_status
SHRINK SPACE CASCADE;
Run Code Online (Sandbox Code Playgroud)
但是,请注意,这可能是一项成本非常高的操作,可能涉及物理移动表中的大部分或所有行。
数据库管理员指南中有一个关于回收浪费空间的章节,更深入地讨论了这个问题和相关问题。它还演示了如何使用企业管理器 GUI 和各种顾问手动或自动回收空间。
归档时间: |
|
查看次数: |
6158 次 |
最近记录: |