oracle优化:优化Oracle库表设计的若干思路方法来源: 发布时间:星期二, 2008年12月23日 浏览:2次 评论:0
正在看ORACLE教程是:优化Oracle库表设计若干思路方法 前言
绝大多数Oracle数据库性能问题都是由于数据库设计不合理造成只有少部分问题根植于Database Buffer、Share Pool、Redo Log Buffer等内存模块配置不合理I/O争用CPU争用等DBA职责范围上所以除非是面对个业已完成不可变更系统否则我们不应过多地将关注点投向内存、I/O、CPU等性能调整项目上而应关注数据库表本身设计是否合理库表设计合理性才是性能真正执牛耳者 合理数据库设计需要考虑以下方面: ·业务数据以何种方式表达如个员工有多个Email你可以在T_EMPLOYEE表中建立多个Email字段如email_1、email_2、email_3也可以创建个T_EMAIL子表来存储甚至可以用逗号分隔开多个Email地址存放在个字段中 ·数据以何种方式物理存储如大表分区表空间合理设计等 ·如何建立合理数据表索引表索引几乎是提高数据表查询性能最有效思路方法Oracle拥有类型丰富数据表索引类型如何取舍选择显得特别重要 本文我们将目光主要聚焦于数据表索引上同时也将提及其他两点内容通过对个简单库表设计例子分析引出设计中不足并逐改正考虑到手工编写库表SQL脚本原始且低效我们将用目前最流行库表设计工具PowerDesigner 10来讲述表设计过程所以在本文中你还会了解到些相关PowerDesigner使用窍门技巧 个简单例子 某个开发人员着手设计个订单系统这个系统中有两个主要业务表分别是订单基本信息表和订单条目表这两张表具有主从关系表其中T_ORDER是订单主表而T_ORDER_ITEM是订单条目表数据库设计人员设计成果如图 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+IS_SHPPED:根据"客户+订货日期+是否发货"条件查询订单及订单条目 ·ORDER_DATE+IS_SHIPPED:根据"订货日期+是否发货"条件查询订单及订单条目 数据库设计人员根据这个要求在T_ORDER表CLIENT、 ORDER_DATE及IS_SHPPED 3字段上建立了个复合索引IDX_ORDER_COMPOSITE;在T_ORDER_ITEM为外键ORDER_ID建立IDX_ORDER_ITEM_ORDER_ID索引 让我们看下该份设计最终SQL脚本: 我们承认在ER关系上这份设计并不存在缺陷但却存在以下有待优化地方: ·没有将表数据和索引数据存储到区别表空间中而不加区别地将它们存储到同表空间里这样不但会造成I/O竞争也为数据库维护工作带来不便 ·ORACLE会自动为表主键列创建个普通B-Tree索引但由于这两张表主键值都通过序列提供具有严格顺序性(升序或降序)此时手工为其指定个反键索引(reverse key index)将更加合理 ·在子表T_ORDER_ITEM外键列ORDER_ID上建立IDX_ORDER_ITEM_ORDER_ID普通B-Tree索引非常适合设置为压缩型索引即建立个压缩型B-Tree索引份订单会对应多个订单条目这就意味着T_ORDER_ITEM表存在许多同值ORDER_ID列值通过将其索引指定为压缩型B-Tree索引不但可以减少IDX_ORDER_ITEM_ORDER_ID所需存储空间还将提高表操作性能 ·企图仅通过建立个包含3字段IDX_ORDER_COMPOSITE复合索引满足如前所述两种查询条件方式索引是有问题事实上使用ORDER_DATE+IS_SHIPPED复合条件查询将利用不到IDX_ORDER_COMPOSITE索引 [NextPage] 优化设计 1、将表数据和索引数据分开表空间存储 1.1 表数据和索引为何需要使用独立表空间 Oracle强烈建立任何个应用库表至少需要创建两个表空间其中的用于存储表数据而另个用于存储表索引数据如果将表数据和索引数据放在起表数据I/O操作和索引I/O操作将产生影响系统性能I/O竞争降低系统响应效率将表数据和索引数据存放在区别表空间中(如个为APP_DATA另个为APP_IDX)并在物理层面将这两个表空间数据文件放在区别物理磁盘上就可以避免这种竞争了 拥有独立表空间就意味着可以独立地为表数据和索引数据提供独立物理存储参数而不会发生相互影响毕竟表数据和索引数据拥有区别特性而这些特性又直接影响了物理存储参数设定 此外表数据和索引数据独立存储还会带来数据管理和维护上方面如你在迁移个业务数据库时为了降低数据大小可以只迁出表数据表空间在目标数据库中通过重建索引方式就可以生成索引数据了 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 _disibledevent='/shujuku/ORACLE/shujuku_2022_2.html'>[2] [3] 0
相关文章
读者评论
发表评论 |