Mol*_*yOQ 5 index oracle oracle-11g-r2 partitioning
问题
我有一个haystack
近 3 TB 的巨型表,按月份 ( date
) 分区并按client
. 我需要创建一个跨越所有客户端的全局索引,以方便按列查询needle
。这很简单。
当月底最旧的表分区被删除时,问题就会出现。我无法承担每个月在 3 TB 表上重建全局索引的费用。haystack
在任何给定时间,数据库中都只有最近四个月的分区。因此,当删除每月分区时,大约 25% 的表会被删除。
尝试的解决方案
我尝试在列上创建一个索引needle
,该索引由 上的哈希进行全局分区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% 来说是巨大的额外工作。