首页 > 解决方案 > 如何在具有功能索引的表上删除行后清理未使用的空间?

问题描述

如何正确清理表空间?

例如,我们有一个包含数百万行和功能索引的表。我们要删除表格的大部分。

为此,我们称之为:从 some_table 中删除 ....

接下来的步骤是什么?

这个顺序正确吗?1. 删除功能指标。2. 改变 some_table 收缩空间。3. 再次创建功能索引。

标签: sqldatabaseoracletablespace

解决方案


您可能已经意识到(或者您不会特别询问基于函数的索引),您不能简单地:

alter table mytable enable row movement;
alter table mytable shrink space;
alter table mytable disable row movement;

尝试这样做会导致:

ORA-10631: 不应为此对象指定 SHRINK 子句

(注意:此限制也适用于位图连接索引。)

显然,你可以先放弃 FBI...

drop index my_fbi_index;
alter table mytable enable row movement;
alter table mytable shrink space;
alter table mytable disable row movement;
create index my_fbi_index... online;

不过,这不是在线操作。您的应用程序将在短时间内受到缺少的基于函数的索引的影响。

如果您需要在线操作并且您使用的是 Oracle 12.2 或更高版本,您可以尝试以下操作:

alter table mytable move online;

( ( alter table...move(no "online") 在 12.2 之前可用,但它不是在线操作,它会删除您的索引段,使索引标记为“不可用”并要求您重新构建它们。所以,这不是一个很好的选择 pre- 12.2.)


推荐阅读