ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle分区表学习(四)

oracle分区表学习(四)

原创 Linux操作系统 作者:Nalternative 时间:2011-02-12 16:54:16 0 删除 编辑

列表分区:

default分区的使用注意:一旦列表分区表有一个default分区,就不能再向这个表中增加更多的分区了

组合分区:是区间分区和散列分区的组合,或者是区间分区与列表分区的组合。

在组合分区中,顶层分区机制总是区间分区。使用组合分区时,并没有分区段,而只有子分区段。分区本身并没有段,数据物理的存储在子分区段上,分区成为一个逻辑容器,或者是一个指向实际子分区的容器。

每个区间分区不需要有相同数目的子分区

行移动:

       如果用于确定分区的列有修改会发生什么,需要考虑两种情况:

1、  修改不会导致使用一个不同的分区;行仍属于原来的分区。这在所有情况下都得到支持。

修改会导致行跨分区移动。只有当表启用了行移动时才支持这种情况;否则,会产生一个错误。



更新记录的分区键列,记录不属于原来的行,启动行移动;
更新时rowid会改变,在其他一些情况下,rowid也有可能因为更新而改变。更新iot的主键可能导致rowid改变,改行的通用rowid(urowid)也会改变
。oracle10g的FLASHBACK TABLE 命令可能改变行的rowid,此外oracle10g的alter table shrink命令也可能使行的rowid改变。
行移动的开销比正常的update昂贵的多,所以构建的系统不应该你频繁修改分区键。



Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as SYS

SQL> CREATE TABLE range_example
  2  ( range_key_column date ,
  3    data             varchar2(20)
  4  )
  5  PARTITION BY RANGE (range_key_column)
  6  ( PARTITION part_1 VALUES LESS THAN
  7         (to_date('01/01/2005','dd/mm/yyyy')),
  8    PARTITION part_2 VALUES LESS THAN
  9         (to_date('01/01/2006','dd/mm/yyyy')),
 10    PARTITION part_3 VALUES LESS THAN
 11         (MAXVALUE)
 12  )
 13  /
 
Table created

SQL> insert into range_example
  2  ( range_key_column, data )
  3  values
  4  ( to_date( '15-01-2004 00:00:00',
  5             'dd-mm-yyyy hh24:mi:ss' ),
  6    'application data...' );
 
1 row inserted

SQL> insert into range_example
  2  ( range_key_column, data )
  3  values
  4  ( to_date( '01-6-2005 00:00:00',
  5             'dd-mm-yyyy hh24:mi:ss' )-1/24/60/60,
  6    'application data...' )
  7  /
 
1 row inserted

SQL>   insert into range_example
  2  ( range_key_column, data )
  3  values
  4  ( to_date( '01-01-2005 00:00:00',
  5             'dd-mm-yyyy hh24:mi:ss' )-1/24/60/60,
  6    'application data...' )
  7  /
 
1 row inserted

SQL> select * from range_example partition(part_1);
 
RANGE_KEY_COLUMN DATA
---------------- --------------------
2004-1-15        application data...
2004-12-31 23:59 application data...

SQL> update range_example
  2     set range_key_column = trunc(range_key_column)
  3   where range_key_column =
  4      to_date( '31-12-2004 23:59:59',
  5               'dd-mm-yyyy hh24:mi:ss' );
 
1 row updated

SQL> update range_example
  2     set range_key_column = to_date('02-1-2005','dd-mm-yyyy')
  3   where range_key_column = to_date('31-12-2004','dd-mm-yyyy')
  4  /
 
update range_example
   set range_key_column = to_date('02-1-2005','dd-mm-yyyy')
 where range_key_column = to_date('31-12-2004','dd-mm-yyyy')
 
ORA-14402: 更新分区关键字列将导致分区的更改

SQL> select rowid
  2    from range_example
  3   where range_key_column = to_date('31-12-2004','dd-mm-yyyy');
 
ROWID
------------------
AAAPRnAABAAAR8yAAB
SQL> alter table range_example
  2  enable row movement;
 
Table altered
 
SQL>
SQL> update range_example
  2     set range_key_column = to_date('02-1-2005','dd-mm-yyyy')
  3   where range_key_column = to_date('31-12-2004','dd-mm-yyyy')
  4  /
 
1 row updated
 
SQL>
SQL> select rowid
  2    from range_example
  3   where range_key_column = to_date('31-12-2004','dd-mm-yyyy');
 
ROWID
------------------
 
SQL>
SQL> select rowid
  2    from range_example
  3   where range_key_column = to_date('02-1-2005','dd-mm-yyyy');
 
ROWID
------------------
AAAPRoAABAAAR86AAB



     组合分区,可以先应用区间分区,再进一步划分各个区间,按一个散列函数或使用列表来分区。这样就能将I/O请求分布到任何给定大分区中的多个磁盘上。另外,现在可以得到3个层次的分区消除:

     如果在区间分区键上查询,oracle就能消除任何不满足条件的区间分区。如果向查询增加散列或列表键,oracle可以消除该区间中其他的散列或列表分区。如果只是在散列或列表键上查询(而不使用区间分区键),oracle就只会查询各个区间分区中的这些散列或列表子分区



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25323853/viewspace-687091/,如需转载,请注明出处,否则将追究法律责任。

下一篇: oracle 写文件
请登录后发表评论 登录
全部评论

注册时间:2011-02-09

  • 博文量
    123
  • 访问量
    174258