Oracle的分区② - 分区表举例
好,接着学习分区表。为了将来可以很熟练得应用分区表,所以专门花一篇的篇幅,来进行分区表的实例模拟。其实操作的难度不大,主要还是关于表的设计和性能问题的分析,这个才是需要经验和技术的东西。
一、分区表的维护
分区表的维护操作比较复杂,具体可参见《Oracle 9i DBA指南》 P272-P293.
二、实际举例
1、移动历史表中的时间窗口
案例如下:有一个表order,包含13个月的事务:1年的历史数据和本月的订单。每个月一个分区,这个按月的分区被命名为order_yymm,也是他们所在的表空间。
另外order表包含两个局部索引:order_ix_onum是一个订单号码上的局部的、前缀的、唯一索引;order_ix_supp是一个供应商号码上的局部的、非前缀索引。局部索引分区用匹配基础表的后缀命名。
还有一个用于客户姓名的全局唯一索引order_ix_cust,并包含3个分区,每个分区用户1/3的字母。
则,1944年10月31日,修改时间窗的步骤如下:
①备份最早的时间间隔数据
ALTER TABLESPACE order_9310 BEGIN BACKUP;
...
ALTER TABLESPACE order_9310 END BACKUP;
②删除最早的时间间隔分区
ALTER TABLE order DROP PARTITION order_9310;
③增加最近的时间间隔的分区
ALTER TABLE order ADD PARTITION order_9411;
④重建全局索引分区
ALTER INDEX order_ix_cust REBUILD PARTITION order_ix_cust_AH;
ALTER INDEX order_ix_cust REBUILD PARTITION order_ix_cust_IP;
ALTER INDEX order_ix_cust REBUILD PARTITION order_ix_cust_QZ;
注意:在更改order表的分区时,需要考虑到用户的并发控制。需要做的2点是:
● 在一个被定义好的批处理窗口期间,关闭所有用户层次的应用
● 通过撤销所有应用使用的角色的访问权限,来保证没有谁可以访问表order
2、将分区视图转换为分区表
案例:分区视图按如下定义:
CREATE VIEW accounts AS
SELECT * FROM accounts_jan98
UNION ALL
SELECT * FROM accounts_fab98
UNION ALL
...
SELECT * FROM accounts_dec98;
修改的步骤如下:
①创建分区表,仅最近两个分区从该视图迁移到分区表中,每个分区获得两个数据块的一个段(作为占位器)
CREATE TABLE accounts_new (...)
TABLESPACE ts_temp STORAGE (INITIAL 2)
PARTITION BY RANGE (opening_date)
(PARTITION jan98 VALUES LESS THEN ('01-FEB-1998'),
...
PARTITION dec98 VALUES LESS THEN ('01-JAN-1999'));
②用EXCHANGE PARTITION语句,将该表迁移到对应分区
ALTER TABLE accounts_new
EXCHANGE PARTITION nov98 WITH TABLE
accounts_nov98 WITH VALIDATION;
ALTER TABLE accounts_new
EXCHANGE PARTITION dec98 WITH TABLE
accounts_dec98 WITH VALIDATION;
这样,与nov98和dec98分区相关的占位器数据段就同accounts_nov98和accounts_dec98表相关的数据段作了交换。
③重新定义accounts视图
CREATE OR REPLACE VIEW accounts AS
SELECT * FROM accounts_jan98
UNION ALL
SELECT * FROM accounts_fab98
UNION ALL
...
UNION ALL
SELECT * FROM accounts_new PARTITION (nov98)
UNION ALL
SELECT * FROM accounts_new PARTITION (dec98);
④删除accounts_nov98和accounts_dec98表
⑤重复以上操作,直至所有表都转换到分区中,删除该视图,并将分区表改为视图名。
DROP VIEW accounts;
RENAME accounts_new to accounts;
三、分区表/索引的相关信息
DBA|ALL|USER_PART_TABLES:显示所有分区表的分区信息
DBA|ALL|USER_TAB_PARTITIONS:显示分区层次的分区信息、分区存储参数、由ANALYZE决定的的统计数据
DBA|ALL|USER_TAB_SUBPARTITIONS:显示子分区层次的分区信息、分区存储参数、由ANALYZE决定的统计数据
DBA|ALL|USER_PART_KEY_COLUMNS:先是分区表的分区键值
DBA|ALL|USER_SUBPART_KEY_COLUMNS:显示组合分区表(和组合分区表上的局部索引)的子分区键列
DBA|ALL|USER_PART_COL_STATISTICS:显示表分区的列统计数据和直方图信息
DBA|ALL|USER_SUBPART_COL_STATISTICS:显示表子分区的列统计数据和直方图信息
DBA|ALL|USER_PART_HISTOGRAMS:显示表的分区上的直方图和直方图数据
DBA|ALL|USER_SUBPART_HISTOGRAMS:显示表的子分区上的直方图和直方图数据
DBA|ALL|USER_PART_INDEXES:显示分区索引的分区信息
DBA|ALL|USER_IND_PARTITIONS:显示索引分区的:分区层次信息、分区存储参数、ANALYZE采集的统计数据
DBA|ALL|USER_IND_SUBPARTITONS:显示索引子分区的:分区层次信息、分区存储参数、ANALYZE采集的统计数据