我有一个包含大量数据的表格,并且正在客户端生产。我必须对其进行在线分区,这意味着我可以停止生产并且应该对表进行分区。我有脚本来做这件事。但我不知道如何在网上进行。他们是我可以实现这一目标的任何方式。请建议..
问问题
149 次
1 回答
3
按照以下步骤,
在与主表相同的结构中创建临时表(例如 TABLE_P 用于 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; /
请注意,这将使依赖对象在架构中变为无效,因此请准备好一些停机时间以清除这些无效。
于 2013-01-08T06:38:15.290 回答