优化Oracle库表设计的若干方法

上传人:cn****1 文档编号:487188975 上传时间:2022-07-22 格式:DOCX 页数:17 大小:605.72KB
返回 下载 相关 举报
优化Oracle库表设计的若干方法_第1页
第1页 / 共17页
优化Oracle库表设计的若干方法_第2页
第2页 / 共17页
优化Oracle库表设计的若干方法_第3页
第3页 / 共17页
优化Oracle库表设计的若干方法_第4页
第4页 / 共17页
优化Oracle库表设计的若干方法_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《优化Oracle库表设计的若干方法》由会员分享,可在线阅读,更多相关《优化Oracle库表设计的若干方法(17页珍藏版)》请在金锄头文库上搜索。

1、优化Oracle库表设计的若干方法.、,、刖言绝大多数的Oracle数据库性能问题都是由于数据库设计不合理造成的,只有少部分问题根 植于 Database Buffer、Share Pool、Redo Log Buffer等内存模块配置不合理,I/O 争用, CPU争用等DBA职责范围上。所以除非是面对一个业已完成不可变更的系统,否则我们不应 过多地将关注点投向内存、I/O、CPU等性能调整项目上,而应关注数据库表本身的设计是 否合理,库表设计的合理性才是程序性能的真正执牛耳者。合理的数据库设计需要考虑以下的方面:业务数据以何种方式表达。如一个员工有多个Email,你可以在T_EMPLOYEE

2、表中建立多 个Email字段如email_1、email_2、email_3,也可以创建一个T_EMAIL子表来存储,甚 至可以用逗号分隔开多个Email地址存放在一个字段中。数据以何种方式物理存储。如大表的分区,表空间的合理设计等。如何建立合理的数据表索引。表索引几乎是提高数据表查询性能最有效的方法,Oracle 拥有类型丰富的数据表索引类型,如何取舍选择显得特别重要。本文我们将目光主要聚焦于数据表的索引上,同时也将提及其他两点的内容。通过对一个简 单的库表设计实例的分析引出设计中的不足,并逐一改正。考虑到手工编写库表的SQL脚本 原始且低效,我们将用目前最流行的库表设计工具PowerDes

3、igner 10来讲述表设计的过程, 所以在本文中你还会了解到一些相关的PowerDesigner的使用技巧。一个简单的例子T ORDER某个开发人员着手设计一个订单的系统,这个系统中有两个主要的业务表,分别是订单基本 信息表和订单条目表,这两张表具有主从关系的表,其中T_ORDER是订单主表,而 T_ORDER_ITEM是订单条目表。数据库设计人员的设计成果如图1所示:T ORDER ITEMORDERJD NUMBER(10) ADDRESSVRCHR2(100)CLIENTV/1RCH2(6O)ORDER_DATE CHR(18)IS_SHIPPED CH明 Cl)REFERENCITE

4、MJD NUMBER(10) ORDERJD NUMBER0 0)ITEMVRCH/iR2(20)COUNTNUMBER0 0)U IDX_ORDER_COMPOSITEH IDX_ORDER_ITEM_ORDER_ID图1订单主从表ORDER_ID是订单号,为T_ORDER的主键,通过名为SEQ_ORDER_ID的序列产生键值,而ITEM_ID 是T_ORDER_ITEM表的主键,通过名为SEQ_ORDER_ITEM的序列产生键值,T_ORDER_ITEM通 过ORDER_ID外键关联到T_ORDER表。需求文档指出订单记录将通过以下两种方式来查询数据:CLIENT + ORDER_DATE

5、+IS_SHPPED :根据客户+订货日期+是否发货条件查询订单及订单 条目。ORDER_DATE+IS_SHIPPED :根据订货日期+是否发货条件查询订单及订单条目。数据库设计人员根据这个要求,在T_ORDER表的CLIENT、ORDER_DATE及IS_SHPPED三字段 上建立了一个复合索引IDX_ORDER_COMPOSITE;在T_ORDER_ITEM为外键ORDER_ID建立 IDX_ORDER_ITEM_ORDER_ID 索引。让我们看一下该份设计的最终SQL脚本:/*订单表*/create table T_ORDER (ORDER_ID NUMBER(10) not null

6、,ADDRESS VARCHAR2(100),CLIENT VARCHAR2(60),ORDER_DATE CHAR(8),IS_SHIPPED CHAR(1),constraint PK_T_ORDER primary key (ORDER_ID);create index IDX_CLIENT on T_ORDER (CLIENT ASC,ORDER_DATE ASC,IS_SHIPPED ASC);/*订单条目子表*/create table T_ORDER_ITEM (ITEM_ID NUMBER(10) not null,ORDER_ID NUMBER(10),ITEM VARCHA

7、R2(20),COUNT NUMBER(10),constraint PK_T_ORDER_ITEM primary key (ITEM_ID);create index IDX_ORDER_ITEM_ORDER_ID on T_ORDER_ITEM (ORDER_ID ASC);alter table T_ORDER_ITEM add constraint FK_T_ORDER_REFERENCE_T_ORDER foreign key (ORDER_ID) references T_ORDER (ORDER_ID);我们承认在ER关系上,这份设计并不存在的缺陷,但却存在以下有待优化的地方:

8、没有将表数据和索引数据存储到不同的表空间中,而不加区别地将它们存储到同一表空间 里。这样,不但会造成I/O竞争,也为数据库的维护工作带来不便。ORACLE会自动为表的主键列创建一个普通B-Tree索引,但由于这两张表的主键值都通过 序列提供,具有严格的顺序性(升序或降序),此时手工为其指定一个反键索引(reverse key index)将更加合理。在子表 T_ORDER_ITEM外键列 ORDER_ID 上建立的 IDX_ORDER_ITEM_ORDER_ID 的普通 B-Tree 索引非常适合设置为压缩型索引,即建立一个压缩型的B-Tree索引。因为一份订单会对应 多个订单条目,这就意味着

9、T_ORDER_ITEM表存在许多同值的ORDER_ID列值,通过将其索 引指定为压缩型的B-Tree索引,不但可以减少IDX_ORDER_ITEM_ORDER_ID所需的存储空间, 还将提高表操作的性能。企图仅通过建立一个包含3字段IDX_ORDER_COMPOSITE复合索引满足如前所述的两种查询 条件方式的索引是有问题的,事实上使用ORDER_DATE+IS_SHIPPED复合条件的查询将利用不 到 IDX_ORDER_COMPOSITE 索引。优化设计1、将表数据和索引数据分开表空间存储1.1表数据和索引为何需要使用独立的表空间Oracle强烈建立,任何一个应用程序的库表至少需要创建两

10、个表空间,其中之一用于存储 表数据,而另一个用于存储表索引数据。因为如果将表数据和索引数据放在一起,表数据的 I/O操作和索引的I/O操作将产生影响系统性能的I/O竞争,降低系统的响应效率。将表数 据和索引数据存放在不同的表空间中(如一个为APP_DATA,另一个为APP_IDX),并在物理 层面将这两个表空间的数据文件放在不同的物理磁盘上,就可以避免这种竞争了。拥有独立的表空间,就意味着可以独立地为表数据和索引数据提供独立的物理存储参数,而 不会发生相互影响,毕竟表数据和索引数据拥有不同的特性,而这些特性又直接影响了物理 存储参数的设定。此外,表数据和索引数据独立存储,还会带来数据管理和维护

11、上的方面。如你在迁移一个业 务数据库时,为了降低数据大小,可以只迁出表数据的表空间,在目标数据库中通过重建索 引的方式就可以生成索引数据了。1.2表数据和索引使用不同表空间的SQL语法指定表数据及索引数据存储表空间语句最简单的形式如下。将表数据存储在APP_DATA表空间里:create table T_ORDER ( ORDER_ID NUMBER(10) not null,)tablespace APP_DATA;将索引数据存储在APP_IDX表空间里:create index IDX_ORDER_ITEM_ORDER_ID on T_ORDER_ITEM ( ORDER_ID ASC)t

12、ablespace APP_IDX;1.3 PowerDesigner 中如何操作1) 首先,必须创建两个表空间。通过Model-Tablespace.在List of Tablespaces中创 建两个表空间:图2创建表空间2)为每张表指定表数据存储的表空间。在设计区中双击表,打开Table Properties设计窗 口,切换到options页,按图3所示指定表数据的存储表空间。图3指定表数据的存储表空间3) 为每个索引指定索引数据的存储表空间。在Table Properties中切换到Indexes页,在 这里列出了表的所有索引,双击需设置表空间的索引,在弹出的Index Propert

13、ies窗口中 切换到Options页,按如下方式指定索引的存储表空间。图4指定索引数据的存储表空间将表空间的问题延展一下:一个应用系统库表的表空间可以进行更精细的划分。首先,如果表中存在LOB类型的字段,有为其指定一个特定的表空间,因为LOB类型的数据 在物理存储结构的管理上和一般数据的策略有很大的不同,将其放在一个独立的表空间中, 就可方便地设置其物理存储参数了。其次,需要考虑库表数据的DML操作特性:根据DML(INSERT,UPDATE,DELETE)操作频繁程 度,将几乎不发生任何DML操作的数据放在独立的表空间中,因为极少DML操作的表可设置 符合其特性的物理参数:如PCTFREE可

14、置为0,其BUFFER_POOL指定为KEEP,以便将数据缓 存在KEEP数据缓存区中等等,不一而足。此外,还可以考虑按业务需要将不同的业务模块分开存放,这主要是考虑到备份问题。假设 我们有一部分业务数据重要性很强,而其他的业务数据重要性相对较弱,这样就可以将两者分开存储,以便设置不同的备份策略。当然,无节制的细化表空间也将带来管理上和部署上的复杂,根据业务需求合理地规划表空 间以达到管理和性能上的最佳往往需要更多的权衡。2、显式为主键列建立反向键索引2.1反向键索引的原理和用途我们知道Oracle会自动为表的主键列建立索引,这个默认的索引是普通的B-Tree索引。对 于主键值是按顺序(递增或

15、递减)加入的情况,默认的B- Tree索引并不理想。这是因为如果 索引列的值具有严格顺序时,随着数据行的插入,索引树的层级增长很快。搜索索引发生的 I/O读写次数和索引树的层级数成正比,也就是说,一棵具有5个层级的B-Tree索引,在 最终读取到索引数据时最多可能发生多达5次I/O操作。因而,减少索引的层级数是索引性 能调整的一个重要方法。如果索引列的数据以严格的有序的方式插入,那么B-Tree索引树将变成一棵不对称的歪树,如图5所示:图5不对称的B-Tree索引而如果索引列的数据以随机值的方式插入,我们将得到一棵趋向对称的索引树,如图6所 示:图6对称的B-Tree索引比较图5和图6,在图5中搜索到A块需要进行5次I/O操作,而图6仅需要3次I/O操 作。既然索引列数据从序列中获取,其有序性无法规避,但在建立索引时,Oracle允许对索引列 的值进行反向,即预先对列值进行比特位的反向,如1000,10001,10011,10111,1100经过反 向后的值将是0001,1001,1101,0011。显然经过位反向处理的有序数据变得比较随机了,这样 所得到的索引树就比较对称,从而提高表的查询性能。但反向键索引也有它局限性:如果在WHERE语句中,需要对

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号