我有一个巨大的表haystack,它的重量接近3TB,按月划分(date),由client细分。我需要创建一个跨所有客户端的全局索引,以方便按列needle查询。这很简单。
这个问题出现在最老的表分区被删除的月底。我不能每个月在3TB的表格上重建一个全球指数。在任何给定时间,数据库中只有四个最近一个月的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处理这些全局索引分区,就好像它们是本地的,但是没有子分区吗?(遗憾的是,我的研究结果是否定的。)
或者..。还有(更好的)吗?解决我的问题的方法?
发布于 2015-05-28 00:26:50
版本<= 11.2?没有*
但在12c中,有一个名为异步全局索引维护的新特性。
DROP PARTITION操作立即完成,使全局索引处于可用状态。诀窍是,索引条目不被维护,它们是孤立的,这些孤立条目稍后将被清除。清理过程在维护窗口中自动发生,或者可以手动启动。
关于此的更多详细信息:https://richardfoote.wordpress.com/category/asynchronous-global-index-maintenance/
*:有,但我不认为它适用于你的情况。删除(而不是截断)分区中的所有行,然后删除它,使全局索引处于可用状态。但是,对于3TB表的25%来说,这是一个巨大的额外工作。
https://dba.stackexchange.com/questions/102614
复制相似问题