删除空分区。索引是不是标记为无效?

Posted

技术标签:

【中文标题】删除空分区。索引是不是标记为无效?【英文标题】:Drop Empty Partition. Are indexes marked as invalid?删除空分区。索引是否标记为无效? 【发布时间】:2013-10-08 14:30:28 【问题描述】:

我想删除一个空的分区,但我知道每当您执行像 DROP 这样的分区 DDL 语句时,oracle 会将所有索引设置为不可用,因此,我应该在语句中添加UPDATE GLOBAL INDEXES,尽管它看起来没有必要。

然后我想出了this post,它说它不会将其标记为不可用,所以我决定对其进行测试。问题是我在两个 oracle 版本中对其进行了测试,但效果不同!

有两个实例:

DBa(Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production) DBb(Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production)

在 DBa 中,它将它们标记为无效,而在 DBb 中,它包含与其他 db(用 exp/imp 克隆)相同的数据,它成功删除而不将它们标记为不可用。

是否可以明确告诉 Oracle 您希望保持索引可用,因为分区中没有数据(不重建索引)?

【问题讨论】:

如果您发现差异,这可能取决于您的统计数据是何时建立的。我使用 11.2,并且在截断(或删除)分区时总是看到标记为 UNUSABLE 的索引。现在,如果您要截断 Oracle 知道为空的空分区(您在它为空后构建统计信息),那么也许 Oracle 足够聪明,知道您的 truncate 语句不会影响任何内容,并且只是将索引保留为 VALID。只是猜测 【参考方案1】:

到目前为止,我无法找出为什么它在一个放置中被标记为无效,而在另一个放置中却没有,但如果有人遇到同样的问题,有话要说。

始终使用UPDATE GLOBAL INDEXES 运行它,因为如果分区为空,则不会花费任何时间来执行删除,并确保索引不会被标记为无效。因此,没有理由希望 oracle 不会标记它们

【讨论】:

我正在检查不是最新的统计数据。有一行被删除并让 oracle 将索引标记为无效。【参考方案2】:

也许你可以在下面尝试,这在下降期间保持索引有效性。 ALTER TABLE t1 DROP PARTITION p5 UPDATE GLOBAL INDEXES;

【讨论】:

【参考方案3】:

是的 .. 在分区表上创建索引时使用 LOCAL 索引

【讨论】:

以上是关于删除空分区。索引是不是标记为无效?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle分区表删除分区引发错误ORA-01502: 索引或这类索引的分区处于不可用状态

oracle 有全局索引怎么删除分区

SQL Server 数据分区管理

SQL Server 数据分区管理

mysqldelete不用*

ClickHouse 内核原理图文详解关于分区索引标记和压缩数据的协同工作...