创建高性能表

来源:互联网 发布:赛尔号漫画制作软件 编辑:程序博客网 时间:2024/05/02 06:12

创建高性能表


创建高性能表

在我们为应用设计数据库的时候,首先要确认我们的数据库是用于OLTP,还是用于DSS,还是用OLTP和DSS的混合。
这样就确定了大方向


OLTP(on-line transaction processing):是为处理大量并发小事务设计的
DSS(decision support systems):是为大数据量的复杂查询而设计的

对于OLTP系统,为了满足大量的并发事务,我们要数据存储创建高性能表和索引


1. 我们要把表/索引创建在ASSM的表空间里,因为oracle在ASSM的表空间里用bitmap替代了freelist来管理segment space,
   所以这样表/索引可以提高更高的DML并发性能


2. 合理设置表/索引的存储参数PCTFREE,PCTUSED,在ASSM中已经废除PCTUSED的概念


3. 为了数据的一致性,数据块有一定数目的事务条目来进行行锁(即ITL),在object层是用initrans和maxtrans两个参数
   控制的,通常默认值就足够了(表的initrans=1,索引的initrans=2).如果知道表/索引上有大并发量的update,并且每
   个block上有很多行,那适当设置高一点的initrans是有益的,在创建表/索引时,指定其值对对象所有的block有其作用。
   如果是create之后调整initrans,那只对以后新分配的block起作用,要让其对所有的block都起作用,就要重组对象
  
   oracle系统的内部表的initrans大部分为1,还有一些是2,4的。其中表SRS$,OBJECT_USAGE的initrans分别是16,30;而oracle
   内部索引大部分都是2和4的。我们可以参考oracle的设计特点来设计我们自己的表/索引的initrans

可以用如下sql查询oracle内部表/索引的initrans

  select tab.table_name,
         ind.index_name,
         tab.ini_trans "表的initrans",
         ind.ini_trans "索引的initrans"
    from dba_indexes ind, dba_tables tab
   where ind.table_name = tab.table_name
   group by tab.table_name, ind.index_name, tab.ini_trans, ind.ini_trans;


4. 如果表很小而且使用比较频繁,可以把表/索cache在内存
   参考:http://blog.csdn.net/wyzxg/archive/2010/03/16/5384762.aspx


5. 底层io的合理规划

6(补充). 我们在设计表的时候,特别是业务特别复杂时,可能需要一些大字段(如,blob/clob),这些类型是几乎不能被缓存的,如果可以的 话,可以用多个varchar类型字段替换,这样就可以提高缓存可能性

对DSS系统,最大的特点就是数据量非常庞大。存储的数据很少会改变,主要用于复杂的查询;为了提高性能,可以采用如下方式

1. partition table(auto/manual),根据查询特点创建全局索引,局部索引,位图索引等
2. 采用并行dml,利用资源换取时间


如果是DSS和OLTP混合的系统,那就要综合考虑。因为硬件总的资源是有限的,要尽量避免两种系统的相互影响,再中间找一个平衡点。例如可以采用对OLTP的相关表分级统计汇总,dss系统尽量不要用OLTP的表

表/索引的设计一定要在设计阶段就要做好,它就好像高楼的地基。一定要打好基础,因为如果上线后,在想调整,那就很困难,代价也非常高。

---end----

更多0
0 0
原创粉丝点击