Oracle 10g R2特性之数据仓库和集成特性(五)

日期: 2008-06-21 来源:TechTarget中国

在某个时刻,您决定将分区Y03Q2移动到另一个表空间 (TRANSY03Q2),该表空间可能位于一个不同类型的磁盘(一个慢一点、便宜一点的磁盘)上。为此,请首先确认您可以联机重新定义该表:


  begin
  dbms_redefinition.can_redef_table( 
  uname        => ’ARUP’,  
  tname        => ’TRANS’, 
  options_flag => dbms_redefinition.cons_use_rowid, 
  part_name    => ’Y03Q2’); 
  end;
  /


  此处没有输出,因此您确认可以联机重新定义该表。接下来,创建一个临时表保存该分区的数据:


  create table trans_temp
  (
  trans_id        number,
  trans_date date,
  txn_type varchar2(1),
  acc_no number,
  tx_amt number(12,2),
  status varchar2(1)
  )
  tablespace transy03q2
  /


  请注意,由于表TRANS进行了范围分区,因此您已经将该表定义为未分区表。该表在所需的表空间TRANSY03Q2中创建。如果表TRANS包含一些本地索引,则表示您已经对表TRANS_TEMP 创建了这些索引(当然是创建为未分区索引)。


  现在,您就可以启动重新定义过程:


  begin
  dbms_redefinition.start_redef_table( 
  uname        => ’ARUP’,  
  orig_table   => ’TRANS’, 
  int_table    => ’TRANS_TEMP’, 
  col_mapping  => NULL, 
  options_flag => dbms_redefinition.cons_use_rowid, 
  part_name    => ’Y03Q2’); 
  end;
  /


  该调用有几个注意事项。第一,将参数col_mapping设置为NULL;在单个分区重新定义中,该参数没有意义。第二,一个新参数part_name指定了要重新定义的分区。第三,注意其中没有 COPY_TABLE_DEPENDENTS 参数,该参数也没有意义,原因是表本身无法更改;只移动分区。


  如果该表很大,此操作可能持续很长时间;因此请在操作过程中对它进行同步。


  begin
  dbms_redefinition.sync_interim_table( 
  uname      => ’ARUP’,  
  orig_table => ’TRANS’, 
  int_table  => ’TRANS_TEMP’, 
  part_name  => ’Y03Q2’); 
  end;
  /


  最后,使用以下代码完成该过程


  begin
  dbms_redefinition.finish_redef_table( 
  uname      => ’ARUP’,  
  orig_table => ’TRANS’, 
  int_table  => ’TRANS_TEMP’, 
  part_name  => ’Y03Q2’); 
  end;


  此时,分区Y03Q2位于表空间TRANSY03Q2中。如果该表存在任何全局索引,则它们将被标记为UNUSABLE并且必须被重新构建。


  单个分区重新定义对于跨表空间移动分区(一个常见的信息生命周期管理任务)很有用。但显而易见,其中存在几个限制。例如,您无法在重新定义过程中更改分区方法(即从范围更改为散列)或更改表的结构。


  逐块地删除表


  您注意到过删除一个分区的表需要多长时间吗?这是因为每个分区都是一个必须删除的段。在Oracle数据库10g第2版中,当您删除分区的表时,分区将逐个被删除。由于每个分区是单独删除的,因此所需的资源要比删除整个表少。


  要演示这个新行为,您可以使用10046跟踪跟踪该会话。


  alter session set events ’10046 trace name context forever, level 12’;


  然后,删除该表。如果查看跟踪文件,则将看到分区表删除的代码:


  delete from tabpart$ where bo# = :1
  delete from partobj$ where obj#=:1
  delete from partcol$ where obj#=:1
  delete from subpartcol$ where obj#=:1


  请注意,分区是按顺序删除的。该方法最大限度地降低了删除过程中的资源使用率并增强了性能。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐