Decode360's Blog

业精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  397 随笔 :: 33 文章 :: 29 评论 :: 0 Trackbacks
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采集的统计数据
 
 
 
 
posted on 2009-03-08 21:56 decode360 阅读(277) 评论(0)  编辑  收藏 所属分类: 08.DBA

只有注册用户登录后才能发表评论。


网站导航: