Chinaunix首页 | 论坛 | 博客
  • 博客访问: 606858
  • 博文数量: 841
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-28 10:08
文章分类

全部博文(841)

文章存档

2011年(1)

2008年(840)

我的朋友

分类:

2008-10-28 10:14:37


  数据库大表的优化:采用蔟表(clustered tables)及蔟索引(Clustered Index)
  
  蔟表和蔟索引是oracle所提供的一种技术,其基本思想是将几张具有相同数据项、并且经常性一起使用的表通过共享数据块(data block)的模式存放在一起。各表间的共同字段作为蔟键值(cluster key),数据库在访问数据时,首先找到蔟键值,以此同时获得若干张表的相关数据。蔟表所能带来的好处是可以减少I/O和减少空间,其中我更看重前者。采用表分区(partition)
  
  表分区技术是在超大型数据库(VLDB)中将大表及其索引通过分区(patition)的形式分割为若干较小、可管理的小块,并且每一分区可进一步划分为更小的子分区(sub partition)。而这种分区对于应用来说是透明的。通过对表进行分区,可以获得以下的好处:
  
  1)减少数据损坏的可能性。
  2)各分区可以独立备份和恢复,增强了数据库的可管理性。
  3)可以控制分区在硬盘上的分布,以均衡IO,改善了数据库的性能。
  
  蔟表与表分区技术的侧重点各有不同,前者侧重于改进关联表间查询的效率,而表分区侧重于大表的可管理性及局部查询的性能。而这两项对于我的系统来说都是极为重要。由于本人技术限制,目前尚不确定两者是否可以同时实现,有那位在这方面有经验的给点指导将不胜感激。 
  
  在两者无法同时实现的情况下,应依照需实现的功能有所取舍。综合两种模式的优缺点,我认为采用表分区技术较为适用于我们的应用。
  
  的表分区有以下几种类型:
  1)范围分区:将表按某一字段或若干个字段的取值范围分区。
  2)hash分区:将表按某一字段的值均匀地分布到若干个指定的分区。
  3)复合分区:结合了前面两种分区类型的优点,首先通过值范围将表进行分区,然后以hash模式将数据进一步均匀分配至物理位置。
  
  综合考虑各项因素,以第三种类型最为优越。(本人实在技术有限仅采用了第1种范围分区,因为比较简单,便于管理)
  
  优化的具体步骤:
  1.确定需要优化分区的表:
  
  经过对系统数据库表结构和字段,应用程序的分析,现在确定那些大表需要进行分区:
  
  如帐户交易明细表acct_detail.
  2.确定表分区的方法和分区键:
  分区类型:采用范围分区。
  分 区 键:
  按trans_date(交易时间)字段进行范围分区.
  
  3.确定分区键的分区范围,及打算分多少分区:
  如:帐户交易明细表acct_detail.
  
  根据字段(trans_date)分成一下分区:
  1).分区1:09/01/2003  
  2).分区2:10/01/2003  
  3).分区3:11/01/2003  
  4).分区4:12/01/2003  
  5).分区5:01/01/2004 
  6).分区6:02/01/2004 
    该表明显需要在以后增加分区。
  4.建立分区表空间和分区索引空间
   1).建立表的各个分区的表空间: 
    1.分区1:crm_detail_200309
    CREATE TABLESPACE crm_detail_200309 DATAFILE 
    ‘/u1/oradata/orcl/crm_detail_20030901.dbf’ 
    SIZE 2000M EXTENT MANAGEMENT LOCAL UNIFORM size 16M;
    其它月份以后同以上(我在此采用oracle的表空间本地管理的方法)。
  
   2). 建立分区索引表空间
    1.分区1:index_detail_200309
    CREATE TABLESPACE index_detail_200309 DATAFILE 
    ‘/u3/oradata/orcl/index_detail_20030901.dbf’ 
    SIZE 2000M EXTENT MANAGEMENT LOCAL UNIFORM size 16M;
  5.建立基于分区的表:
    create table table name
    (
    ........
    
    enable row movment        --此语句是能修改行分区键值,也就是如不添加该句不能修改记录的分区键值,不能使记录分区迁移
    PARTITION  BY  RANGE (TRANS_DATE)
    (
      PARTITION   crm_detail_200309 VALUES LESS THAN 
  (TO_DATE (‘09/01/2003’,’mm/dd/yyyy’ 
  TABLESPACE  crm_detail_200309,
      其他分区.....
     ;
  6.建立基于分区的索引:
   create index  index_name on table_name (分区键+…)
    global                 --这里是全局分区索引,也可以建本地索引
    PARTITION  BY  RANGE (TRANS_DATE)
    (
     PARTITION   index_detail_200309 VALUES LESS THAN 
     (TO_DATE ('09/01/2003','mm/dd/yyyy' ) 
     TABLESPACE  index_detail_200309,
     其他索引分区...
    ;
    
  对表的分区就这样完成了,第一次主要确定表分区的分区策约是最重要的,可我觉得对表分区难在以后对表分区的管理上面,因为随着数据量的增加,表分区必然存在删除,扩容,增加等。在这些过程中还牵涉到全局等索引,因为对分区表进行ddl操作为破坏全局索引,故全局索引必须在ddl后要重rebuild.
  
  ------------------------签----名----
  $-)
    movb  $0x88,%ah
    int  $0x15
    movw  %ax,(02)
    movw  $SYSSEG, %ax
【责编:admin】

--------------------next---------------------

阅读(276) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~