Chinaunix首页 | 论坛 | 博客
  • 博客访问: 542795
  • 博文数量: 128
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 1345
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-22 21:43
文章分类

全部博文(128)

文章存档

2009年(30)

2008年(98)

我的朋友

分类: Oracle

2008-06-22 21:58:58

范围分区-最常见的分区方式
散列分区-
混合分区-


##############
#  范围分区  #
##############

create table range_example
(range_key_column date,
 data varchar2(20)
)
partition by range(range_key_column)
(PARTITION part_1 values less than
 (to_date('01-01-1995', 'dd-mm-yyyy')),
 PARTITION part_2 values less than
 (to_date('01-01-1996', 'dd-mm-yyyy'))
);

# 范围分区可以使用的关系


#  测试行移动
SQL> insert into range_example
  2    values( to_date('01-01-1994', 'dd-mm-yyyy'), 'application data');
 
1 row inserted
 
SQL> update range_example
  2  set range_key_column = range_key_column + 1;
 
1 row updated                           

正如所料
 
SQL> update range_example
  2  set range_key_column = range_key_column + 366;
 
update range_example
set range_key_column = range_key_column + 366
 
ORA-14402: 更新分区关键字列将导致分区的更改


SQL> select rowid from range_example;
 
ROWID
------------------
AAAChiAAFAAADiYAAA

# 设置表允许行移动
SQL> alter table range_example enable row movement;
Table altered


SQL> update range_example
  2  set range_key_column = range_key_column + 366;

1 row updated


SQL> select rowid from range_example;
 
ROWID
------------------
AAAChjAAFAAADigAAA

理解,这个行的ROWID值将随着这个更新而改变,因为从一个分区移动到另一个分区。


###############
#   散列分区  #
###############
散列分区的目的在于跨越许多不同的设备(磁盘),以取得良好的数据扩展性能。为了提供数值的良好扩展性能,为一个表选择的散列码应该是
尽可能惟一的一列或一组列。

create table hash_example
(hash_key_column date,
 data varchar2(20)
)
PARTITION BY HASH(hash_key_column)
(partition part_1 tablespace p1,
 partition part_2 tablespace p2
);


################
#   混合分区   #
################
create table composite_example
(range_key_column date,
 hash_key_column  int,
 data             varchar2(2)
)
PARTITION BY RANGE(range_key_column)
subpartition by hash(hash_key_column) subpartitions 2
(
  PARTITION part_1
  VALUES LESS THAN(to_date('01-01-1995', 'dd-mm-yyyy'))
  (subpartition part_1_sub_1,
   subpartition part_1_sub_2
  ),
  PARTITION part_2
  values less than(to_date('01-01-1996', 'dd-mm-yyyy'))
  (subpartition part_2_sub_1,
   subpartition part_2_sub_2
  )
);

首先应用范围分区原则算出这些数据落入哪个范围,然后应用散列函数来决定数据最终放入哪个物理分区

在混合分区中,如果按范围分区码进行查询,Oracle能排除任何不符合标准的范围分区。
如果把散列码加入到查询中,Oracle能排除在那个范围内的其他散列分区。
如果只是按散列码进行查询(不使用范围分区码),Oracle将只从每个范围分区中查询那些适用的散列子分区。
阅读(1041) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~