一
1. 先建立逻辑模型,也就是ER图 ,再映射为物理模型。
2. 关于范式, 标准化数据模型一般都不是最终的结果,但他始终是建模最好的起点。
键,完整的键,除了键没有其他东西。
3. 关于数据类型的选择。
由于oracle在数据类型的物理存储上采用非常灵活的方式,因此从存储和性能考虑,使用限制性很强的数据类型或者精度 并没有优势。
二
选择数据类型时,要注意以下方面:
1.大部分情况下,不管你如何限制数据类型,Oracle内部都会使用大范围高精度的浮点方式进行存储,针对于数字和日期。
就算你给一个数字指定了精度,这个精度更多的意义在于约束数据或定义文档,而不是为了优化性能。
也有例外的情况,就是精度能够减少数据的长度,就会有利于性能的提高。
2.固定长度的字符串都会占用一个固定长度的存储空间。 采用固定长度可以降低碎片,但是可能会导致较大的平均行长,导致全表扫描开销加大。
因此,除非你十分确定字符串的长度是确定的,比如MAC地址,否则你就应该选择变长字符串类型。
3 varchar在11g之后全部用varchar2替代,现阶段 2者是一样的。
4. 对于大文件,推荐使用 lob类型。 Blob 二进制, Clob 文本,bfile 外部储存。
三 关于人造建:
人造键通常会比自然键带来更好的性能。
他通常由一个数字类型构成。
相比自然键,会减少表连接的开销和索引查询的开销。
逻辑模型不要一对一映射到物理模型,逻辑主要考虑功能的实现,物理 主要考虑 性能和储存方式,,这样可以大大节约以后调优的时间。!!
四 关于表类型的选择
后谈
五 关于null 值
普通索引不要存null,null不会走索引,只能全表扫。
组合索引 和位图索引可以储存null。
采用null可以降低行的平均长度,从而一定程度上提高全表扫描的性能。
将查询null 更改为查询一个默认值,就是为了走索引。!!
null值的储存需要一个字节的储存空间。
六 列的顺序
访问靠后的列,比靠前的列 需要额外消耗少量的CPU资源。 基于此,把经常访问的列放到前面会带来少量的性能提升。
七 反规范化
1. 复制列值
主要为了避免使用表连接进行查询。
三 物理方面
物理存储方案
1. 当往表中插入新纪录的时候,oracle需要扫描空闲数据块链表。 ASSM 能够自动的很好的完成 空闲数据快链表 以避免 链表争用。针对对插入事务频繁的表。
2. 通过合理设置pctfree 来避免行迁移。数据走,留指针。
3. 在一个事务更改一个块的时候,会获得事务槽,如果事务槽无法自动增加分配,那么事务将会等待。
4,数据压缩,基本都是说的能够提高全表扫描的性能,我的理解是对于范围扫描,也可以提高性能。 字符串的压缩率大于数字类型,对磁盘中数据的压缩收益要大于对内存中数据的压缩。
5 关于lob
一般储存超过4000字节的数据,否则用varchar2来储存。 通常情况下,Lob数据不会跟同一行记录的其他列储存在相同的数据块中,只有lob对象不到4000 ,才inline储存。
控制方式: enable/disable storage in row。
如果LOB字段是经常需要访问的字段,那么建议还是采用inline储存。因为访问外部储存 的lob需要额外的IO。
请设置db_securefile参数, 可以将新的lob列的默认储存方式设置为 secure file。
6 关于分区
分区主要在与2点, 分区消除,便于管理历史分区数据而不影响当前分区。
关于设计原则,就是以上内容,转载:http://blog.csdn.net/familyrun/article/details/47037393
关于细节规范:
- 如果开发过程中需要建立索引,需要提交书面的更改请求,说明所需索引的定义(名称、字段列表、顺序、索引类型)以及建立的理由。数据库管理员统一维护索引并将提交的请求更改。
- 数据库各表的初始数据(包含各代码表、配置表)需要提交给数据库管理员。
- 不得使用触发器。
- 涉及到数据库多表数据的更改(Insert/Delete/Update)必须使用数据库事务进行控制,并且必须有完整事务开始和提交/回滚机制。不能使用范围事务
- 尽量避免Union操作的使用,需要使用时,请向数据库管理员咨询使用Union操作的影响。
- SQL语句和存储过程,尽量使用PL/SQL Develper的代码美化器美化。
- 属于ORACLE的关键字大小,表名、列名等小写。