如何在進行定期分區清除的大表上維護全域索引?
問題
我有一個
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% 來說是巨大的額外工作。