我有大量数据的表格,并且在客户端正在制作。我必须做在线分区,这意味着我可以暂停生产,表应该被分区。我有脚本来做它。但我不知道如何在网上做到这一点。他们以任何方式实现这一目标。请建议..
答案 0 :(得分:3)
按照以下步骤
在与主表相同的结构中创建临时表(例如TABLE_P for TABLE),并在必需列上对此临时表进行分区。不要将主表的主键和其他索引添加到此临时表中。
create table TABLE_P
(
COL1 VARCHAR2(35 CHAR) not null,
COL2 VARCHAR2(35 CHAR) not null,
)
--add partition (Example taken here is Range partitioning) from here
PARTITION BY RANGE (COL1) (
PARTITION p0 VALUES LESS THAN (5),
PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (15),
PARTITION p3 VALUES LESS THAN (MAXVALUE)
--add partition till here
使用所需列为此表创建索引。
create index IX01_TABLE on TABLE_P (COL1) local;
运行以下脚本进行重定义。替换为实际的模式名称。
begin
dbms_redefinition.can_redef_table( 'SCHEMA', 'TABLE' );
end;
/
begin
dbms_redefinition.start_redef_table('SCHEMA', 'TABLE','TABLE_P' );
end;
/
declare
error_count pls_integer := 0;
BEGIN
dbms_redefinition.copy_table_dependents(uname => 'SCHEMA',
orig_table => 'TABLE',
int_table => 'TABLE_P',
num_errors => error_count);
dbms_output.put_line('errors := ' || to_char(error_count));
END;
/
begin
dbms_redefinition.finish_redef_table('SCHEMA', 'TABLE','TABLE_P');
end;
/
请注意,这将使依赖对象在模式中变为INVALID,因此请准备好一些停机时间以清除这些残留物。