热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《Oracle性能优化求生指南》第四章:数据库逻辑设计和物理设计学习小结1

1、建立逻辑数据模型为第一阶段,包括对应用程序需要处理和存储的信息进行建模,并确保所有必要的数据都能够正确、完整且无歧义地表示。在关系数据库的实现中&#
1、建立逻辑数据模型为第一阶段,包括对应用程序需要处理和存储的信息进行建模,并确保所有必要的数据都能够正确、完整且无歧义地表示。在关系数据库的实现中,这通常是指构造一个标准化的实体-关系(E-R)模型
2、将逻辑数据模型映射为物理数据模型为第二阶段。对关系数据库来讲,物理数据模型描述的是表、索引、视图、键和其他一些数据库特性
3、第三范式:
实体(表)的所有数据完全依赖于主键。
不能有重复的属性(列)或属性组。
不存在仅依赖部分主键的实体数据。
不存在依赖于其他非主键的实体数据。
用一条格言描述:”键,完整的键,除了键没有其他东西。“
4、无论从文档或定义角度看,逻辑模型中精确定义属性的数据类型、长度、精度都有优势。由于Oracle在数据类型的物理存储上采用的是通用且灵活性很强的内部实现方式,因此从存储或性能角度看,使用限制性很强的数据类型或精度并没有优势
5、不管如何限制数据类型,大部分情况下,Oracle内部都会使用大范围高精度的浮点方式进行存储。
6、固定长度类型的字符串都会占用一个固定长度的存储空间,而不管字符串的真实长度是多少。采用固定的航长度可以降低碎片,但是它会导致较大的平均行长,这样就会增加全表扫描的开销。因此,除非数据的长度确实是固定的,否则就应该优先选择变长字符串类型(VARCHAR)。
7、人造键:
是由Oracle sequence产生的一个数字类型的列。
没有任何含义,只是为了唯一地标识实体中的记录。
从来不会被更新。
自然键:
可由多列组成并可包括任何数据类型。是由实体中具有唯一性的自然属性构成的。
如果自然键被更新,则引用它的外键也需要更新,这将显著增加IO开销和锁争用。
显然,必须基于自然键的列进行索引查询的需求也是很常见的,为满足这种需求,可以在这些列上创建普通索引或唯一约束。
8、逻辑阶段的主要目的是确保设计能够满足应用的功能需求。物理设计阶段的目的才是确保数据库能够满足应用的性能需求。将逻辑自雷转化为表的时候,要避免采用分开的父类表和子类表的方法,而要选择将所有子类映射为一个表,或采用单独的子类表而没有上一级表的方式。
9、表的类型有堆表、索引组织表、聚簇等。
散列聚簇(Hash Cluster):能够有效优化大小相对固定的表的主键查询,与B*树索引相比,散列聚簇还能降低热点块上的闩锁争用。
索引聚簇(Index Cluster):共享聚簇键值的多个表中的记录存储在一起,这样可以优化多表联结。虽然多表联结性增强了,但仅针对聚簇中某个表的全表扫描的性能却降低了。
嵌套表(Nested Table):能够针对主表中的某一行优化对明细行的检索。但是,如果要跳过主表行检索明细行的话,性能通常会大打折扣。
索引组织表:如果大部分表访问都是通过主键进行查询,并且表数据量的变动幅度较大而不适合使用散列聚簇,使用索引组织表将会更高效。
对象表(Object Table):行都被定义为一个Oracle对象数据类型,需要使用对象表的场景非常少。
10、精度的意义更多在于约束数据或定义文档,而不是为了优化性能。但是,如果一个高精度的数值被偶然指定给一个精度限制较弱的数字字段,这时候设定一个精度就可能对性能有所帮助。例如NUMBER(*,2)那么不必要的精度将会被截断,行的长度也将相应地减少。设置该数值列的精度有时可以减少行的长度
11、DATE可以精确到秒,TIMESTAMP可以亚秒级,可以配置到纳秒级的精度,其默认精度则为微秒。
12、字符串若小于4000字节,优先选择VARCHAR2类型。
字符串若大于4000字节,推荐使用LOB类型,CLOB存储字符数据,BLOB存储二进制数据。
11g提供高性能的LOB存储类型,称为SecureFiles。
每个表只能有一个LONG数据类型的列,和早期的Oracle版本兼容。
优先选择VARCHAR2不是VARCHAR,VARCHAR将来会受到修改,以符合ANSI的标准。
13、B*树索引不能存储NULL,因此需要全表扫描来查找NULL值。位图索引和(部分列为NULL的)多列组合索引就能存储NULL值。
采用NULL可以降低行的平均长度,从而一定程度上提高全表扫描的性能
如果该列的数值大部分是NULL,并且查询仅需检索非NULL的值,则该列上的索引会比较紧凑并很高效。
因此,决定一列是否可以为NULL的时候,要考虑在该列上是否有使用B*树索引查询NULL的需求。如果有,则不能指定该列为NULL,取而代之的是定义该列为NOT NULL(非空),并指定一个默认值
如果要查询那些未知的值,则不能定义列为空,相反,要定义列为非空并指定一个默认值。
对于字符类型的数据,默认值可以是一个字符串,例如UNKNOWN或N/A。
对于数字类型,选择合适的默认值会有难度,例如,统计包含AGE字段,基于索引扫描或查询AGE列时,可能需要找出年龄不确定(UNKNOWN)的记录。如果给AGE指定一个默认值,当查询平均年龄、最小年龄和最大年龄的时候,可能会得到不正确的结果。这种情况,使用NULL时必要的,但查询不能快速返回那些AGE不确定的记录,要么进行反规范化,增加一个标记列来标记年龄是否已知,并在该标记列上建立索引,以便于查询AGE不确定(AGEKNOWN=N)的记录。NULL值可以存储在位图BITMAP索引中,上述中或许不会仅因为这个理由选择位图索引,如果该AGE列上存在位图索引,可以高效地检索NULL值。
14、除非表中每一个字段都是固定长度的字符串,否则Oracle无法知道某列在行物理存储结构中的具体位置
访问表中靠后的列相比访问靠前的列,需要额外消耗少量的CPU资源。
因为Oracle必须顺序扫描行结构以获得某个特定的列的位置,基于这个原因,将经常需要访问的列存储在表的前面,会带来一些正面的性能影响。
那些值为NULL的字段通常需要一个字节的存储空间,但如果该行中随后的列的数值都为NULL,则Oracle不需要为这些NULL分配任何空间。如果将那些大部分为NULL的列存储在表的末尾,则行的实际长度会变小,这样有助于提高表扫描的性能
这些调整带来的性能改进比较小,因此列的逻辑顺序应使数据模型更易于理解和维护,而不是为了这些微小的优化而使逻辑模型中列的顺序变得混乱。
15、反规范化:是指在物理模型中重新引入冗余、重复或其他非规范化结构的过程,主要意图是为了提高性能。
16、概要表
如果实时汇总数据是必需的,则每当源数据被更新时,必需同时更新汇总数据。通过数据库触发器或物化视图来手动实现这一点,但若更新十分频繁,则可能导致锁争用。
如果实时汇总信息不实必需的,则可以通过定期的作业调度更新概要表-费业务高峰期进行。使用Oracle物化视图机制实现。但会导致不实时的不准确的汇总信息。
17、Oracle 11g的结果集缓存。
18、进行聚合操作的查询通常会占用大量数据库资源,最好是使用物化视图来维护反规范化的汇总信息
19、通常,将逻辑子类型实现为从表会降低常见SQL操作的性能。
垂直分区(Vertical Partitioning):经常在全表扫描操作中访问到的列需要保留在主表中,较少访问的列则存储在第二章表中。
20、视图:给用户只有一张表的假象。通常在应用程序查询子表的时候用以获得最佳性能,代价是使SQL应用复杂化。
21、Oracle有时会允许将一张表物理地分割成多个数据段,同时让用户保留一个单一逻辑表的印象,例如:
LOB数据通常会存储在单独的数据段。
索引组织表中,一些数据将被存储在溢出段中。
如果表很大,且预计会有频繁表扫描,可以考虑将字段较长且不常访问的列迁移到一个单独的子表中,以减少长度和提高表扫描的性能
22、优先使用数据库触发器来保证反规范化数据的一致性,避免通过应用代码来维护。数据库触发器降低了数据不一致的风险,简化了应用代码,同时更加高效。
23、事实表的外键几乎都是由序列生成的人造数字键。从存储的观点看,如果事实表的外键都是有意义的字符串的话,则存储成本比较高:例如,一个产品的具体名称占用的空间可能是产品ID占用空间的10倍。保持较短的行长度对事实表来说是重要的,因为事实表上会经常有全表(或分区)扫描
24、尽量避免使用雪花模式。当维度表不包括外键的时候,查询性能通常会得到优化。
25、通过创建层次化的维,可以提高那些需要使用较高层次聚集数据的查询的性能,例如,查询每月总收入将不再需要累加该月份中每天的收入记录,从而大大提高了性能。
可以考虑针对多层次的聚集数据采用多个事实表的方式,采用多个事实表是常用的数据仓库解决方案,但Oracle还提供了一个更复杂的称为物化视图的方法。
物化视图本质是一个物理表,它包含了将会由视图的定义返回的记录。如果将普通的视图看做存储在数据库中的查询语句,物化视图就可以被看作是数据库中存储的查询结果
Oracle可以自动维护物化视图,保证是最新的或是定期更新。
26、物化视图最佳实践:
针对物化视图所包括的每一张表,都要创建物化视图日志。
使用CREATE DIMENSION语句来标识各维度之间的层次关系。
设置参数QUERY_REWRITE_ENABLED,启动查询重写功能。
选择合适的物化视图刷新策略。推荐使用ON DEMAND刷新策略,不是ON COMMIT刷新策略,适用于大量数据更新时刷新。
选择参数QUERY_REWRITE_INTEGRITY。
合理创建物化视图。如果有疑虑,则需要比较并评估创建与不创建物化视图对查询和DML语句的性能影响,以衡量物化视图带来的额外开销能否从查询性能的提高中得到足够的补偿。


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
宝宝壮壮妈
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有