问题
我有一个haystack
近 3 TB 的巨型表,按月 ( date
) 分区并按client
. 我需要创建一个跨越所有客户端的全局索引,以方便按列查询needle
。这很简单。
问题出现在月底删除最旧的表分区时。我负担不起每个月在 3 TB 表上重建全局索引的费用。haystack
在任何给定时间,只有最近一个月的四个分区在数据库中。因此,删除每月分区时,大约会删除 25% 的表。
尝试的解决方案
我尝试在needle
由 hash on 全局分区的列上创建索引needle
。但这意味着从表中删除旧月份分区时必须重建整个全局索引。不好。
我还尝试在列 ( date
, needle
) 上创建索引,该索引按范围进行全局分区,范围date
与表的每月分区匹配。但同样,当从表中删除旧月份分区时,我仍然被迫更新我的整个全局索引——即使我的表和索引的分区相同(表的子分区除外)。
当然,我不能简单地创建一个本地分区索引。我需要分区是本地的,但没有子分区。据我所知,这是不可能的;对于索引上的本地分区选项,这是一个全有或全无的选择。
删除分区
为了完整起见,这是我在月底尝试删除旧分区的一些选项...
alter table HAYSTACK drop partition P_MONTH update global indexes;
这需要很长时间,因为它试图在下跌期间维持全球指数。
alter table HAYSTACK drop partition P_MONTH;
如果没有全局索引子句,我的全局索引会留下所有分区标记为不可用。(可以理解。)
alter index HAYSTACK_IDX drop partition P_MONTH;
删除我的索引分区会使高值刚好高于已删除分区的分区无效。如果我现在继续删除表分区,我仍然必须重建我的整个全局索引。
我的问题
有没有办法可以清除旧表分区而不使全局索引分区失效或重建?本质上,我能否以某种方式告诉 Oracle 处理这些全局索引分区,就好像它们是本地的一样,但没有子分区?(可悲的是,我的研究说不。)
或者......还有另一种(更好的?)方法来解决我的问题吗?
版本 <= 11.2?不。*
但是在 12c 中,有一个新特性叫做异步全局索引维护。
该
DROP PARTITION
操作立即完成,使全局索引处于可用状态。诀窍是,索引条目不被维护,它们是孤立的,这些孤立的条目将在以后被清理。清理过程在维护窗口中自动发生,也可以手动启动。有关此的更多详细信息:https ://richardfoote.wordpress.com/category/asynchronous-global-index-maintenance/
*:有,但我认为不适用于您的情况。在删除分区之前删除(而不是截断)分区中的所有行会使全局索引处于可用状态。但这对于 3 TB 表的 25% 来说是巨大的额外工作。