关于Oracle的几个分区

Oracle8i起,可以把一个表中的所有行为分为几个部分,这种表称为分区表。
1)优点
改善表的查询性能,因为这样ORACLE可能只需搜索一个区(表的一部分)面不是整个表就可以完成查询。
均衡I/O,可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
增强可用性,如果表的某个分区出现故障,表在其他分区的数据仍然可用
维护方便,如果表的某个分区出现故障,需要修复数据,只修复该分区即可
表更容易管理,因为分区表的数据存放在多个部分中,按分区加载各删除数据比在大表中加载和删除数据更容易
备份和恢复操作会执行得更好,分区比被分区的表要小,备份各恢复分区的方法要比备份各恢复整个表的方法多。
2)建立分区表
1>范围分区
可以使用 CREATE TABLE 命令的 PARTITION BY RANGE 子句:

CREATE TABLE bookshelf_range_part
(
title VARCHAR2(100) PRIMARY KEY,
publisher VARCHAR2(20),
categoryname VARCHAR2(20),
rating VARCHAR2(2),
CONSTRAINT catfk2 FOREIGN KEY (categoryname) REFERENCES category(categoryname)
PARTITION BY RANGE(categoryname)
(
PARTITION part1 VALUES LESS THAN('b') TABLESPACE part1_ts,
PARTITION part2 VALUES LESS THAN(MAXVALUE) TABLESPACE part2_ts));

MAXVALUE 指定了最后一个分区交用来存储在前面几个分区不能存储的数据。
可以建立多个分区,每个分区都有自己的上限值,对于每个分区来说,只需要指定最大值即可,范围的最小值同 ORACLE 隐含含义。
2)散列分区
oracle8i 引入了散列分区,散列分区通过在分区键值-执行一个散列函数来决定数据的物理位置。在范围分区中,分区键值连续的值通常在相同的分区中,而散列分区中,连续的分区键值不一定分布在相同的分区中(一般均匀分布在不同的分区中):这样在潜在地减少了I/O争用的可能性。

CREATE TABLE bookshelf_hash_part
(
title VARCHAR2(100) PRIMARY KEY,
publisher VARCHAR2(20),
rating VARCHAR2(2),
CONSTRAINT cartfk_hash FOREIGN KEY(categoryname)
REFERENCES category(categoryname)
PARTITION BY HASH(categoryname) PARTITIONS 2 STOREIN(part1_ts,part2_ts));

这各方法将建立 SYS_Pnnn 的名称的分区,在storein语句中指定的表空间的数据目可以不同 PARTITIAONS 中分区的数目。如果分区数目比指定的表空间数目多,分区将会以循环的方式分配到表空间中。
可以指定分区的表名:

PARTITION BY HASH(categoryname)
(PARTITION part1 TABLESPACE part1_ts,
PARTITION part2 TABLESPACE part2_ts);

3>子分区
oracle8i起,可以建立分区的分区,即子分区。子分区把范围分区和散列分区结合起来。

CAREATE TABLE bookshelf_range_hash_part
(
title VARCHAR2(100) PRIMARY KEY,
publisher VARCHAR2(20),
categoryname VARCHAR2(2),
rating VARCHAR2(2),
CONSTRAINT cartfk3 FOREIGN KEY(categoryname) REFERENCES category(categoryname)
PARTITION BY RANGE(title)
SUBPARTITION BY HASH(categoryname)
SUBPARTITIONS 6
(
PARTITION part1 VALUES LESS THAN('m') TABLESPACE part1_ts,
PARTITION part2 VALUES LESS THAN(MAXVALUE) TABLESPACE part2_ts);
)

4>列表分区
从oracle9i起,可以使用列表分区。在列表分区中,告诉ORACLE所有可能的值,并将分区指定到插入相应行的分区。

CREATE TABLE booksheif_list_part
(
title VARCHAR2(100) PRIMARY KEY,
publisher VARCHAR2(20),
categoryname VARCHAR2(20),
rating VARCHAR2(2),
CONSTRAINT cartfk4 FOREIGN KEY(categoryname) REFERENCES category(categoryname)
PARTITION BY LIST(categoryname)
(
PARTITION part1 VALUES ('adultfic','adultnf','adultref') TABLESPACE part1_ts,
PARTITION part2 VALUES('childrenfic','childrennf','childrenpic') TABLESPACE part1_ts
)
);

在使用列表分区表时,如果INSERT到分区列的值不在分区的定义中,INSERT的操作将产生错误。
3)索引分区
1>局部索引
索引可以按照表进行分区时所用的分区数来分区(局面部分区)。

CREATE INDEX bookshelf_list_category ON bookshelf_list_part(categoryname) LOCAL
(PARTITION part1 TABLESPACE part1_ndx_ts,
PARTITION part2 TABLESPACE part2_ndx_ts);

2>全局索引
可以使用GLOBAL关键字建立包含多个分区值的全局索引。

CREATE INDEX bookshelf_list_category ON bookshelf_list_part(publisher) GLOBA;

局部索引比全局索引容易管理,但全局索引进行唯一性检查的速度可能比局部索引快。
全局索引建立时 global 子句允许指定索引的范围值,这个范围值为索引字段的范围值:

CREATE INDEX dinya_idx_t ON dinya_test(item_id)
GLOBAL PARTITION BY RANGE(item_id)
(
PARTITION idx_1 VALUES LESS THAN(1000) TABLESPACE dinya_space01,
PARTITION idx_2 VALUES LESS THAN(10000) TABLESPACE dinya_space02,
PARTITION idx_3 VALUES LESS THAN(MAXVALUE) TABLESPACE dinya_space03
);

不能为散列分区或子分区建立全局索引。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值