我们有一组涉及1tb+数据的24个表,这就是为什么DBA建议使用分区来更好地处理使用情况。
唯一的问题是对现有表进行分区,因为从当前表到临时表的数据传输将需要很长时间(Dbms_redefinition),因此他们建议使用2表方法,其中旧表将是静态的,新表将被分区,select将根据需要将两个表合并。
我只是想探索一下,在不需要大量停机时间的情况下,是否有其他方法对现有表进行分区。
发布于 2017-03-10 05:48:07
Oracle数据库提供了一种机制,可以在不显著影响表可用性的情况下对表结构进行修改。该机制称为联机表重新定义。与传统的重新定义表的方法相比,在线重新定义表提供了大量的可用性。
您可以在线重新定义表,DML可以访问该表。该表将在一段可忽略的时间内以独占模式锁定,而该表的大小并不重要。
缺点是,您必须有与您的表(1TB)大小相等的额外空间。
更新:
非分区表到分区表的联机转换可转换为联机分区表。索引作为此操作的一部分进行维护,并且也可以进行分区。转换对正在进行的DML操作没有影响。
在Oracle12c第2版中,可以使用ALTER TABLE语句将非分区表转换为分区表。但是,根据您的标记,您是在11g R2,您没有这个选项。
文档:
发布于 2017-03-10 20:59:10
旧表将是静态的,新表将被分区,而select将根据需要将两个表合并在一起。
在不复制任何内容或需要任何额外空间的情况下,在瞬间完成这一操作非常容易,而且您根本不需要使用UNION或重写任何东西,因为您可以使用1个表来完成这一任务。
假设你的桌子是这样的:
create table t1 (col1 date, col2 number);然后,使用一个分区创建此表的分区版本,在该分区中可以存储所有现有数据:
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约束。
发布于 2017-03-10 06:10:23
唯一的缺点是额外的空间等于表的大小(1TB)。
https://dba.stackexchange.com/questions/166780
复制相似问题