Oracle

在 Oracle 中對包含大量數據的現有表進行分區的可行性

  • December 9, 2018

我們有一組 24 個表,佔用大約 1tb+ 數據,這就是 DBA 建議使用分區來更好地處理使用情況的原因。

唯一的問題是現有表的分區是他們不建議的,因為從目前表到臨時表的數據傳輸將花費大量時間(dbms_redefinition),這就是為什麼他們建議使用舊表的 2 表方法是靜態的,新表將被分區,並且 select 將根據需要成為 2 個表的並集。

我只是想探索是否有任何其他方式對現有表進行分區而不需要大量停機時間

Oracle 數據庫提供了一種機制來修改表結構,而不會顯著影響表的可用性。該機制稱為線上表重定義。與重新定義表格的傳統方法相比,線上重新定義表格可顯著提高可用性。

您可以線上重新定義該表,並且 DML 可以訪問該表。該表將在可忽略的時間段內以獨占模式鎖定,此時表的大小無關緊要。

缺點是您必須擁有與表大小相等的額外空間(1TB)。

更新:

非分區表到分區表的線上轉換

非分區表可以線上轉換為分區表。索引作為此操作的一部分進行維護,也可以進行分區。轉換對正在進行的 DML 操作沒有影響。

在 Oracle 12c 第 2 版中,您可以使用語句將非分區表轉換為分區表ALTER TABLE。但是,根據您的標記,您在 11g R2 中並且沒有此選項。

文件:

其中舊表將是靜態的,新表將被分區,並且 select 將根據需要是 2 個表的並集

這真的很容易在不需要複製任何內容或需要任何額外空間的情況下立即完成,而且您根本不需要使用 UNION 或重寫任何內容,因為您可以使用 1 個表完成此操作。

假設你的桌子是這樣的:

create table t1 (col1 date, col2 number);

然後,您使用 1 個分區創建此表的分區版本,您可以在其中儲存所有現有數據:

create table t1_exch (col1 date, col2 number)
partition by range (col1)
interval (numtodsinterval(1, 'day'))
(
 partition p1 values less than (date'2017-03-11')
);

然後你用分區交換你的表:

alter table t1_exch exchange partition p1 with table t1;

最後刪除舊表,並重命名新表以使用舊表的名稱:

drop table t1 purge;
alter table t1_exch rename to t1;

之後插入的數據'2017-03-11'將自動分區,您可以保留舊數據,也可以根據需要拆分為分區。

對數據進行分區很容易,繁瑣的部分可能是處理需要全域的約束和索引。您可能需要更改您的 PK 和唯一約束(和索引),因為如果沒有包含在其中的分區鍵,您就無法在本地對此類索引進行分區。還因為刪除了舊表並在其位置上放置了一個新表,您需要整理出指向該表的 FK 約束。

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