- 浏览: 495879 次
- 性别:
- 来自: OnePiece
文章分类
- 全部博客 (196)
- --------- 基础----------- (0)
- java 碎碎念 (12)
- java 并行编程 (11)
- java I/O (6)
- java Charset & Encoding (2)
- spring学习笔记 (8)
- 正则表达式 (5)
- web前端-javascript (11)
- web前端-jQuery (7)
- web前端-碎碎念 (1)
- mybatis (0)
- 数据库-通用 (8)
- 数据库-oracle (20)
- nosql-redis (11)
- nosql-mongoDB (1)
- xml (2)
- log4j (2)
- uml (3)
- web services: soap/wsdl (6)
- soa-tuscany (2)
- linux (6)
- ----------修养----------- (0)
- 深入理解java虚拟机 (7)
- java 设计模式 (9)
- 数据结构和算法 (2)
- 读书笔记--代码整洁之道 (2)
- 计算机基础 (1)
- -----------践行---------- (0)
- 重构(refactor) (7)
- jvm-诊断 (4)
- 数据库-让oracle跑得更快 (7)
- Nginx (6)
- ehcache (2)
- 短信开发 (1)
- Servlet+Filter+Listener (2)
- 运维 (6)
- 问题记录 (38)
- 杂七杂八 (12)
最新评论
-
zhanggang807:
第二种方法比较好
<spring> 定时任务每次都执行两次的问题,慎用new ClassPathXmlApplicationContext() -
assasszt:
谢谢分享,很清楚的讲明了原理。
字符集与字符编码简介 -
su0nils000:
难得的笔记
<进阶-2> 打造高效正则表达式 -
足至迹留:
mini188 写道用MD5来解决碰撞是不是也是可行的呢?个人 ...
Hash简介 -
mini188:
用MD5来解决碰撞是不是也是可行的呢?
Hash简介
此《让oracle跑得更快》系列参考《让Oracle跑得更快 Oracle.10g性能分析与优化思路》.(谭怀远)
一个数据库是否存在性能问题,基本上在系统设计的时候就决定了,这里说的系统设计包含软件的设计,数据库的设计和硬件的设计。软件的设计包含了软件系统架构的设计,软件代码的编写;数据库的设计包含了数据库的类型选择和根据数据库类型的所有数据库对象的设计;硬件的设计包括存储结构的设计,硬件的性能选择和冗余设计。在一个系统的设计阶段,任何一个环节存在设计不得当之处,都可能导致系统的性能下降,而系统的性能在多数情况下又反映为数据库的性能问题。
1.1 软件设计对数据库的影响
1.1.1 软件架构设计对数据库性能的影响
软件系统的架构对数据库的影响是非常直接的。如果并发数非常大,比如是超过3000个并发,通常这种情况下,我们会考虑采用一套软件来搭建一个中间层,就是通常讲到的3层或多层结构。使用这一套软件的目的是用来构建一个缓冲池,在数据库之前对大量的并发进行处理,以便每次只有少数的用户连接到数据库中,其他的用户在缓冲池的队列中等待。同时,很多这种中间件软件还提供了负载均衡的功能。
1.1.2 软件代码的编写对数据库性能的影响
通常指的是应用程序代码中对数据库操作的代码部分对数据库产生的影响。具体来讲就是sql语句或pl/sql包,一种是sql语句本身在逻辑上就是效率低下的,另一种就是sql语句没有绑定变量。
性能低下的sql语句,比如使用hint(比如强制指定使用索引,这对CBO选择执行计划是不利的),不合适的外连接(外连接是一个代价非常昂贵的执行过程,要分析语句执行,是否可以用内连接等价外连接等),谓词的隐含转换,优化器的选择等,会对sql的执行产生非常大的影响,特别是多表关联的情况下,影响更是显著。它主要体现为sql语句的执行受到了人为的约束,比如数据的访问方式(索引还是全局扫描),以及表关联方式的选择上(hash join, nested loops)。
1.1.2.1 CBO下优化模式的选择
通常对于一种功能单一的数据库来讲,在实例级设置一个优化器模式就可以了,比如OLAP系统,绝大多数时候数据库上运行着的是报表作业,执行基本上是聚合类的sql操作,比如group by,把优化器模式设置为all_rows是恰当的。
而对于一些分页操作比较多的网站类数据库,设置为first_rows会比较好。
如果是OLAP系统,实例级优化模式已经设置为all_rows,但是系统又需要一些分页查询功能,这时候就可以在代码中用hint指定first_rows模式。
注意:只有在必要的时候才可以在代码中加入hint,否则不是一个好主意,会随着数据的变化导致执行缓慢。
1.1.2.2 没有绑定变量的sql
对于这个话题,很多人存在一个误区。有时候它对性能的影响被夸大化了。大家在谈及sql时必定要求绑定变量,仿佛不这样就要出问题了一样。实际上,至少对于OLAP系统(在线分析系统,通常指的是这样的一个系统,数据库存放着海量的数据,连接的用户少,sql语句基本上都是用户产生报表的大查询)来说,未绑定变量对数据库的影响是很有限的,甚至是完全没有必要的,因为只有少量的用户和少量的sql操作,数据库不需要花多少资源在sql分析上面。
绑定变量的真正用途是在一个OLTP系统中,这个系统通常有这样的特点,用户并发数很大,用户的请求十分密集,并且这些请求的sql大多数是可以重复使用的。如果一条sql执行一遍之后被缓存到数据库的内存当中(实际上是共享池里),以后的成百上千的用户请求都使用这个sql解析后的结果,那效率将有非常大的提高。
1.1.2.3 pl/sql包
如果你的程序里有pl/sql包,请考虑使用存储过程来代替它,存储过程是经过成功编译后存放在数据库中的代码,执行起来的效率要比程序代码中pl/sql包的效率高很多,因为它不再需要做语法和语义的分析。
1.2 数据库的设计
数据库的设计在系统设计当中是一个非常重要的环节,但目前来看,很多开发商忽略了它应有的重要性,大多数的数据库设计基本上等同于创建业务所需要的所有对象,仅此而已。
对于数据库的设计,除了一些必需的对象创建之外,应该还要更多地考虑在整个系统运行的生命周期中,按照系统的实际情况及可能的变化做一些前瞻性的设计,以基本满足系统生命周期里的各方面需求,不至于发生大的修改或升级。
基本上看来,前期数据库设计的一个根本就是要弄清数据库的类型。比如OLTP系统强调数据库的内存效率,强调内存各种指标的命中率,强调绑定变量,强调并发操作;而OLAP系统sql的优化非常重要,它强调数据分析,强调sql执行时长,强调磁盘IO,强调分区等。因为这些区别,在数据库设计的阶段,弄清数据库类型是至关重要的,只有在这个前提之下,才能讨论数据库的具体设计。
1.3 数据库的硬件设计
数据库的硬件设计在性能上主要体现在:
(1) CPU
(2) IO
(3) 负载情况
这些指标需要对业务进行综合评估和系统测试之后,做出一个合理的硬件配置清单。
数据库的硬件设计包含了数据库服务器的架构和数据存储。这些因素在数据库设计阶段将作为重点的考虑因素。如果当系统上线之后,出现冗余或空间不足的问题,将是一件非常麻烦的事情。
1.4 小结
1. 系统的数据库类型,OLAP还是OLTP
弄清楚系统是OLAP或是OLTP是一件非常重要的事情,它将影响到数据库所有的相关设置,不论是内存参数,存储参数还是性能参数,可以说是系统设计阶段数据库设计最优先考虑的事情。
2. 系统并发量
如果是一个OLTP系统,并发将作为非常重要的一个因素考虑,如果设计阶段没有对系统的并发数做出准确的估算,将会出现非常严重的后果。
高的并发数可能导致这样两个严重的后果:
(1) 系统资源严重被使用,系统过负荷运行。
(2) 严重的等待事件,比如热块以及锁定等情况。
3. Sql代码的编写
性能低劣的sql对数据库的杀伤力是巨大的。开发人员,特别是数据库接口的开发人员,应该好好学习一下sql的开发技巧,它不但包括sql功能的实现,还有sql语句的优化性。
4. 数据库的设计
数据库本身的设计在系统设计中也至关重要,因此更推崇让DBA来参与或执行这个工作。当然,要根据项目和公司人力的实际情况。
5. 存储的设计
在系统设计阶段,一定要预测系统预期的数据使用空间,否则以后数据库扩容将是一件非常麻烦的事情,特别是那些不允许宕机的系统,尤其应该将各种因素考虑清楚,最大可能地消除将来由于自身设计的问题导致的隐患。
一个数据库是否存在性能问题,基本上在系统设计的时候就决定了,这里说的系统设计包含软件的设计,数据库的设计和硬件的设计。软件的设计包含了软件系统架构的设计,软件代码的编写;数据库的设计包含了数据库的类型选择和根据数据库类型的所有数据库对象的设计;硬件的设计包括存储结构的设计,硬件的性能选择和冗余设计。在一个系统的设计阶段,任何一个环节存在设计不得当之处,都可能导致系统的性能下降,而系统的性能在多数情况下又反映为数据库的性能问题。
1.1 软件设计对数据库的影响
1.1.1 软件架构设计对数据库性能的影响
软件系统的架构对数据库的影响是非常直接的。如果并发数非常大,比如是超过3000个并发,通常这种情况下,我们会考虑采用一套软件来搭建一个中间层,就是通常讲到的3层或多层结构。使用这一套软件的目的是用来构建一个缓冲池,在数据库之前对大量的并发进行处理,以便每次只有少数的用户连接到数据库中,其他的用户在缓冲池的队列中等待。同时,很多这种中间件软件还提供了负载均衡的功能。
1.1.2 软件代码的编写对数据库性能的影响
通常指的是应用程序代码中对数据库操作的代码部分对数据库产生的影响。具体来讲就是sql语句或pl/sql包,一种是sql语句本身在逻辑上就是效率低下的,另一种就是sql语句没有绑定变量。
性能低下的sql语句,比如使用hint(比如强制指定使用索引,这对CBO选择执行计划是不利的),不合适的外连接(外连接是一个代价非常昂贵的执行过程,要分析语句执行,是否可以用内连接等价外连接等),谓词的隐含转换,优化器的选择等,会对sql的执行产生非常大的影响,特别是多表关联的情况下,影响更是显著。它主要体现为sql语句的执行受到了人为的约束,比如数据的访问方式(索引还是全局扫描),以及表关联方式的选择上(hash join, nested loops)。
1.1.2.1 CBO下优化模式的选择
通常对于一种功能单一的数据库来讲,在实例级设置一个优化器模式就可以了,比如OLAP系统,绝大多数时候数据库上运行着的是报表作业,执行基本上是聚合类的sql操作,比如group by,把优化器模式设置为all_rows是恰当的。
而对于一些分页操作比较多的网站类数据库,设置为first_rows会比较好。
如果是OLAP系统,实例级优化模式已经设置为all_rows,但是系统又需要一些分页查询功能,这时候就可以在代码中用hint指定first_rows模式。
注意:只有在必要的时候才可以在代码中加入hint,否则不是一个好主意,会随着数据的变化导致执行缓慢。
1.1.2.2 没有绑定变量的sql
对于这个话题,很多人存在一个误区。有时候它对性能的影响被夸大化了。大家在谈及sql时必定要求绑定变量,仿佛不这样就要出问题了一样。实际上,至少对于OLAP系统(在线分析系统,通常指的是这样的一个系统,数据库存放着海量的数据,连接的用户少,sql语句基本上都是用户产生报表的大查询)来说,未绑定变量对数据库的影响是很有限的,甚至是完全没有必要的,因为只有少量的用户和少量的sql操作,数据库不需要花多少资源在sql分析上面。
绑定变量的真正用途是在一个OLTP系统中,这个系统通常有这样的特点,用户并发数很大,用户的请求十分密集,并且这些请求的sql大多数是可以重复使用的。如果一条sql执行一遍之后被缓存到数据库的内存当中(实际上是共享池里),以后的成百上千的用户请求都使用这个sql解析后的结果,那效率将有非常大的提高。
1.1.2.3 pl/sql包
如果你的程序里有pl/sql包,请考虑使用存储过程来代替它,存储过程是经过成功编译后存放在数据库中的代码,执行起来的效率要比程序代码中pl/sql包的效率高很多,因为它不再需要做语法和语义的分析。
1.2 数据库的设计
数据库的设计在系统设计当中是一个非常重要的环节,但目前来看,很多开发商忽略了它应有的重要性,大多数的数据库设计基本上等同于创建业务所需要的所有对象,仅此而已。
对于数据库的设计,除了一些必需的对象创建之外,应该还要更多地考虑在整个系统运行的生命周期中,按照系统的实际情况及可能的变化做一些前瞻性的设计,以基本满足系统生命周期里的各方面需求,不至于发生大的修改或升级。
基本上看来,前期数据库设计的一个根本就是要弄清数据库的类型。比如OLTP系统强调数据库的内存效率,强调内存各种指标的命中率,强调绑定变量,强调并发操作;而OLAP系统sql的优化非常重要,它强调数据分析,强调sql执行时长,强调磁盘IO,强调分区等。因为这些区别,在数据库设计的阶段,弄清数据库类型是至关重要的,只有在这个前提之下,才能讨论数据库的具体设计。
1.3 数据库的硬件设计
数据库的硬件设计在性能上主要体现在:
(1) CPU
(2) IO
(3) 负载情况
这些指标需要对业务进行综合评估和系统测试之后,做出一个合理的硬件配置清单。
数据库的硬件设计包含了数据库服务器的架构和数据存储。这些因素在数据库设计阶段将作为重点的考虑因素。如果当系统上线之后,出现冗余或空间不足的问题,将是一件非常麻烦的事情。
1.4 小结
1. 系统的数据库类型,OLAP还是OLTP
弄清楚系统是OLAP或是OLTP是一件非常重要的事情,它将影响到数据库所有的相关设置,不论是内存参数,存储参数还是性能参数,可以说是系统设计阶段数据库设计最优先考虑的事情。
2. 系统并发量
如果是一个OLTP系统,并发将作为非常重要的一个因素考虑,如果设计阶段没有对系统的并发数做出准确的估算,将会出现非常严重的后果。
高的并发数可能导致这样两个严重的后果:
(1) 系统资源严重被使用,系统过负荷运行。
(2) 严重的等待事件,比如热块以及锁定等情况。
3. Sql代码的编写
性能低劣的sql对数据库的杀伤力是巨大的。开发人员,特别是数据库接口的开发人员,应该好好学习一下sql的开发技巧,它不但包括sql功能的实现,还有sql语句的优化性。
4. 数据库的设计
数据库本身的设计在系统设计中也至关重要,因此更推崇让DBA来参与或执行这个工作。当然,要根据项目和公司人力的实际情况。
5. 存储的设计
在系统设计阶段,一定要预测系统预期的数据使用空间,否则以后数据库扩容将是一件非常麻烦的事情,特别是那些不允许宕机的系统,尤其应该将各种因素考虑清楚,最大可能地消除将来由于自身设计的问题导致的隐患。
发表评论
-
<让oracle跑得更快-7> AWR性能报告
2015-03-01 22:45 2134AWR是oracle 10g下提供的一 ... -
<让oracle跑得更快-6> 绑定变量
2015-02-28 21:52 1250变量绑定是OLTP系统中一 ... -
<让oracle跑得更快-5> 执行计划
2015-02-28 21:48 1293如果要分析某条(不是整体性能,后面还会讲到awr报告,会再次说 ... -
<让oracle跑得更快-4> 优化器(optimizer)
2015-02-27 21:27 2057Oracle数据库中优化器(o ... -
<让oracle跑得更快-3> latch和等待
2015-02-27 21:18 1170经常有人把latch造成的 ... -
<让oracle跑得更快-2> 锁和阻塞
2015-02-26 22:24 11682.1 锁和阻塞 首先,注意区别并发(concurrency) ... -
OLTP(联机事务处理)和OLAP(联机分析处理) 【转】
2015-02-12 14:13 1250做数据库优化时,一定要先了解数据库支撑的应用特点,不同类型的应 ... -
<oracle优化>(url收藏)
2015-02-11 22:18 8251. CBO & RBO Rule Based Opt ... -
<oracle-11> 数据类型
2015-02-08 20:06 2557选择一个正确的数据类 ... -
<oracle-10> 索引
2015-02-01 21:19 2040索引是应用设计和开发的一个重要方面。如果有太多的索引,修改(插 ... -
<oracle-9> 数据库表
2015-01-30 15:44 13229.1 表类型 Oracle主要有 ... -
<oracle-8> redo和undo
2015-01-26 22:23 1655本章介绍oracle数据库中 ... -
<oracle-7> 事务
2015-01-26 11:07 1551事务(transaction)是数 ... -
<oracle-6> 并发多版本控制
2015-01-12 21:17 14666.1 什么是并发控制 并 ... -
<oracle-5> 锁(lock)和闩(latch)
2015-01-07 21:11 2767开发多用户、数据库驱动的应用时,最大的难点之一是:一方面要力争 ... -
<oracle-4> oracle进程
2015-01-06 23:02 1404Oracle中的各个进程要完成某个特定的任务或一组任务,每个进 ... -
<oracle-3> 内存结构
2015-01-05 22:20 1556这一篇主要讨论oracle的3 ... -
<oracle-2> oracle文件
2014-12-22 20:57 1141与oracle实例相关的文件只有下面几种: 参数文件(para ... -
<Oracle-1> oracle体系结构概述
2014-12-21 22:02 1225本系列主要参考《Oracle ...
相关推荐
“让Oracle跑得更快2:基于海量数据的数据库设计与”这一主题,正是聚焦于解决这一问题,旨在通过合理的数据库设计和性能优化策略,提升Oracle在处理大规模数据集时的效率。 ### 一、海量数据处理 海量数据处理的...
让Oracle跑得更快2基于海量数据的数据库设计与优化
"让Oracle跑得更快Ch1-3.CHM"这个文件很可能包含了上述内容的详细讲解,涵盖了数据库性能优化的多个层面,包括基础理论、实践技巧和案例分析。通过深入学习这个文档,你可以掌握如何诊断和解决Oracle性能问题,实现...
标题和描述均指向一个主题:“让Oracle跑得更快”,这显然是一份专注于提升Oracle数据库性能的资料。Oracle作为全球领先的关系型数据库管理系统之一,其性能优化对于提高数据处理速度、增强系统响应能力和确保业务...
### Oracle 10g性能分析与优化:深入理解Latch及其优化策略 #### 一、Latch与Lock的区别 在Oracle数据库的性能优化过程中,理解和区分Latch与Lock是非常重要的。两者虽然都涉及资源的控制和访问,但其作用机制和对...
《让Oracle跑得更快:基于海量数据的数据库设计与优化》是谭怀远先生的著作,专注于探讨如何在处理大规模数据时提升Oracle数据库的性能。这本书的第二版深入讲解了Oracle数据库在面对海量数据时的设计策略和优化技巧...
《让Oracle跑得更快》是针对Oracle 10g数据库性能分析与优化的一份深入指南。Oracle数据库系统作为全球广泛使用的数据库管理系统之一,其性能优化对于企业数据处理效率至关重要。Oracle 10g版本在性能方面引入了许多...
Oracle数据库分区和压缩技术应用——让Oracle跑得更快.pdf
第1章 引起数据库性能问题的因素 1 1.1 软件设计对数据库的影响 1 1.1.1 软件架构设计对数据库性能的影响 1 1.1.2 软件代码的编写对数据库性能的影响 2 1.2 数据库的设计 8 1.2.1 oltp数据库 9 1.2.2 olap数据库 10 ...
由于文件中的部分内容是重复的链接,我们将忽略这些重复内容,并专注于标题和描述中提到的“让oracle跑得更快”以及“如果你深入学习oracle,如果你想学习优化oracle,下它吧!”。以下是对这些知识点的详细说明: ...
《让Oracle跑得更快 2 基于海量数据的数据库设计与优化》是一本深入探讨如何在大数据环境下提升Oracle数据库性能的专业书籍。该书详细阐述了针对大规模数据的数据库设计策略以及优化技术,旨在帮助读者理解并解决...
《让Oracle跑得更快:基于海量数据的数据库设计与优化》是谭怀远先生的著作,专注于讲解如何在处理大规模数据时提升Oracle数据库的性能。这本书对于深入理解Oracle数据库的内部机制、设计高效的数据库架构以及实施...
不过,根据标题《让Oracle跑得更快2:基于海量数据的数据库设计与优化》以及描述中的作者名“谭怀远”,我们可以推测该文档应是一本专注于Oracle数据库性能提升和海量数据处理的优化指南。以下将基于这一主题,结合...
《让Oracle跑得更快》是一本专注于Oracle数据库性能优化的专业书籍。通过阅读这本书,你可以深入理解如何提升Oracle数据库的运行效率,从而优化整个系统的性能。Oracle数据库是全球广泛使用的大型企业级数据库系统,...
根据提供的标题、描述以及部分上下文内容,我们可以推断出这篇文章主要关注的是Oracle 10g数据库系统的性能分析与优化方法。尽管实际内容部分只包含了重复的博客链接,但基于标题和描述,我们可以构建出一系列关于...
鉴于提供的文件信息中没有包含可分析的具体内容,我无法针对"让Oracle跑得更快.pdf"这一电子书提供详细的知识点。然而,基于标题中提到的“Oracle”和“跑得更快”,我可以提供一些普遍性的知识点和建议,这些建议...
让Oracle跑得更快基于海量数据的数据库设计与优化].谭怀远.第2版
为了帮助广大DBA(数据库管理员)及IT专业人士解决这一问题,“让你的Oracle跑得更快”应运而生。 #### 关键知识点解析 ##### 一、理解Oracle性能瓶颈 - **硬件资源限制**:CPU处理能力、内存大小及I/O速度等硬件...