Oracle

如何在進行定期分區清除的大表上維護全域索引?

  • December 5, 2016

問題

我有一個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% 來說是巨大的額外工作。

引用自:https://dba.stackexchange.com/questions/102614