2017-08-01 47 views
1

我對數據庫非常陌生。我想爲oracle中的現有大型數據庫表執行系統分區。有人可以建議 如何在Oracle數據庫中實現對現有表的系統分區?如何在Oracle 11g中進行系統分區?

請注意我只是在尋找系統分區不尋找範圍或散列或複合分區。

+0

什麼是「系統分區」? –

+0

這是應用程序邏輯控制分區結構的Oracle數據庫分區方法。 –

+0

請參閱[this](https://docs.oracle.com/cd/E11882_01/server.112/e25523/partition.htm#BABFCBHC)和[this](https://docs.oracle.com/cd/E11882_01 /server.112/e41084/statements_7002.htm#BABJBDCC)...但不確定這真的有助於解釋OP在這裏要做什麼。 –

回答

6

據我所知,現有的表不能分區。你將不得不重新創建它。 對於這種情況,有一個稱爲dbms_redefinition的Oracle包(詳情請參閱https://docs.oracle.com/database/121/ARPLS/d_redefi.htm),但我將提供一個非常簡單的示例,而不使用此包。

假設你有以下的非分區表:

create table T_TABLE 
(
    pkey   NUMBER not null, 
    t_data  VARCHAR2(250) not null, 
    partitionkey NUMBER not null 
); 

如果你想分區表,第一步就是重命名錶:

alter table t_table rename to old_table; 

然後,創建新表

create table T_TABLE 
(
    pkey   NUMBER not null, 
    t_data  VARCHAR2(250) not null, 
    partitionkey NUMBER not null 
) 
partition by system 
(
    partition p1 tablespace users, 
    partition p2 tablespace users, 
    partition p3 tablespace users 
);  

現在您可以將舊錶中的表格行插入新表。你的application/sql需要告訴服務器在哪個分區中插入。 例如,像這樣:

insert into t_table partition (p1) select * from old_table where partitionkey = 1;  
insert into t_table partition (p2) select * from old_table where partitionkey = 2; 
insert into t_table partition (p3) select * from old_table where partitionkey = 3;   
commit; 

現在你可以刪除舊錶。

drop table old_table; 
+2

Fyi,Oracle [在12.2中引入了分區非分區表](https://docs.oracle.com/en/cloud/paas/exadata-express-cloud/csdbf/oracle-database-12-2-new -features.html#GUID-D5D9C311-3597-4494-B8DE-CE33EE4FA546) – Boneist

+0

酷 - 感謝提示。儘管可能需要幾年時間才能使用該新功能。 –

+0

是的,我在同一條船上(我願意爲12.2擴展的to_char/to_number/etc函數獲得我的雙手!),但我認爲這是值得分享的信息* {:-)我相信博客,我讀了它,除了我不記得現在誰發佈了它! – Boneist

相關問題