首页 > Linux操作系统 > Linux操作系统 > oracle分区表学习(四)
列表分区:
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博客 ” ,链接:https://blog.itpub.net/25323853/viewspace-687091/ ,如需转载,请注明出处,否则将追究法律责任。