数据库逻辑设计与物理设计

  应用程序数据模型设计通常分两个阶段。建立逻辑数据模型为第一阶段,它包括对应用程序需求处理和存储的信息进行建模,并确保所有必要的数据都能够正确完整且无歧义的表示。关系数据库中,通常指构造一个标准化的实体-关系(E-R)模型。

 将逻辑数据模型映射为物理数据模型为第二阶段。对关系数据库来讲,物理数据模型描述的是表、索引、视图、键和其它一些数据库特性。在传统的方法论中,逻辑数据模型设计往往忽略性能,而物理模型设计过程才开始对此进行考虑。

  1、标准化和三范式

  1.1 一个标准化的数据模型是没有任何数据冗余的,并且数据和关系能够被主键和外键唯一标识。从性能角度考虑,标准化数据模型一般不是最终建模的结果,但它始终是建模的最好起点。

  1.2 第三范式是现在采纳最广泛的标准,特征就是所有数据完全依赖于主键。

 2、数据类型选择

  2.1 使用限制性很强的数据类型或精度并没有优势。不管如何限制数据类型,大部分情况下,Oracle内部都会使用大范围高精度的浮点方式进行存储。

  2.2 采用固定长度的行长度可以降低碎片,但是它会导致较大的平均行长,这样会增加全表扫描的开销。因此,除非数据的长度确实是固定的,否则就应该优先选择变长字符串类型VARCHAR

  2.3 VARCHAR可存储4000字节,9i以前版本就需要用LONG或LOB来存储这么长的字节。

  2.4 Oracle Long 数据类型有很多局限性,现在都推荐使用LOB类型。

 3、人造键<Oracle sequence>

  一个自然键是由实体中具有唯一性的自然属性构成的,而人造键是没有任何含义的,它的存在就是为了唯一地标识实体中的记录。

  自然健可以由多列组成并可包括任何数据类型。而人造键大多是一些连续的数字。人造键通常会带来更好的性能。

  多列组合成的自然键,健的长度的增加,导致表联接和索引查询会消耗更高。

  如果自然健被更新,则引用它的也需要更新,这将显著增加I/O和锁争用。而自然键没有含义,不要更新。

  人造健索引空间小,因此索引树的深度会更低,有助于提升索引查询的性能。

 4、可选的属性和NULL值

  采用NULL可以降低行的平均长度,从而一定程度上提高全表扫描的性能,但是B树索引不能存储NULL,因此需要全表扫描来查找NULL值,而位图索引和组合索引可以存储NULL值。

 5、列的顺序--对性能有微小的影响

  访问表中靠后的列,相比访问靠前的列,需要额外消耗少量的CPU资源,因为ORACLE必须顺序扫描行结构以获得特定的列的位置

 6、反规划化

  规范化(Normalization)是指从数据模型中消除冗余和重复组,并确保关键属性是正确的。逻辑建模阶段的产生通常是一个规范化数据模型。

  反规范化(Denormalization)是指在物理模型中重新引入冗余,重复或其它非规范化过程,主要意图是为了提高性能。

 7、垂直分区

  如果表很大,且预计会有频繁扫描,可以考虑将字段较长且不常访问的列迁移到一个单独的子表中,以减少行长度和提高 表扫描性能。

 8、并行插入和空闲块链接

  ASSM(Automatic Segment Storage Management)数据段存储自动管理

  当往表插入新记录时,Oracle要扫描空闲数据块链表(freelist)以获得合适的剩余空间来存储新记录的数据块。如果并行操作频繁,需设置多个空闲链表来避免一种特别Buffer_busy争用问题。ASSM可自动处理此问题。MSSM则不行。

 9、PCTFREE与PCTUSED

 PCTFREE控制数据块的预留百分之多少的空闲空间,当数据块的空闲空间百分比低于PCTFREE时,设块不能插入新的记录。

 PCTUSED决定一个空闲空间曾经少于PCTFREE的数据块,在做了数据删除后,当利用率低于PCTUSED时,又可以重新插入记录。

 如果PCTFREE参数设置的太小,且表上有频繁的更新操作,则很可能发生行迁移(row migration),行迁移会在旧数据块上保留一个指向新数据块的指针。如此则通过索引扫描会额外消耗一次IO。

  如果一个表上有频繁的全表扫描打操作,则确保不要将PCTFREE设置得过高,尤其是该表上的更新操作很少会导致记录长度增加的时候。

  如果设置了较低的PCTFREE,则需要增加INITRANS参数的值,该参数可以通过建表语句设置。该参数控制一个ORACLE数据块在初始的时候有多少事务槽。

  如果PCTFREE为0,则可能在分配新事务槽(TRANSACTION SLDT)的时候,发现数据块已经没有剩余空间而导致无法分配。如此,多个会话将无法同时更新数据块的内容,这时行级锁将会退化为数据块级锁。

 10、压缩 --降低存储数据需要的空间

  压缩表变小,读取数据I/O也会减少,如此会大大提升全表扫描的性能。

 11、散列分区策略

  11.1 你需要在大表上执行并行DML之类的并行操作,或者在多个大表之间执行并行表连接操作。

  11.2 你预计表上会有大量并发的DLTP形式的访问,特别是你认为会产生热块并导致严重的争用。

 12、索引

 12.1 创建可广泛使用并有良好选择性的组合索引应该在索引策略中拥有最高优先级

 12.2 如果我们略过组合索引第一列,Oracle仍可通过跳跃扫描(Skip-Scanning)来使用,这需要扫描每一个前导列值来找到匹配的非前导列值。因此它在前导列的不同值较少的时候运行最有效。

 12.3 如果where子句中出现了表上的多个列,但没有包含所有相关的组合索引,只有包含单个列的索引,则Oracle有可能会执行索引合并(index merge)

posted @ 2018-11-28 15:20  酒醉汉  阅读(2330)  评论(0编辑  收藏  举报