2017-08-01 55 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