- 浏览: 484926 次
- 性别:
- 来自: 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 2073AWR是oracle 10g下提供的一 ... -
<让oracle跑得更快-6> 绑定变量
2015-02-28 21:52 1196变量绑定是OLTP系统中一 ... -
<让oracle跑得更快-5> 执行计划
2015-02-28 21:48 1223如果要分析某条(不是整体性能,后面还会讲到awr报告,会再次说 ... -
<让oracle跑得更快-4> 优化器(optimizer)
2015-02-27 21:27 2006Oracle数据库中优化器(o ... -
<让oracle跑得更快-3> latch和等待
2015-02-27 21:18 1121经常有人把latch造成的 ... -
<让oracle跑得更快-2> 锁和阻塞
2015-02-26 22:24 11252.1 锁和阻塞 首先,注意区别并发(concurrency) ... -
OLTP(联机事务处理)和OLAP(联机分析处理) 【转】
2015-02-12 14:13 1207做数据库优化时,一定要先了解数据库支撑的应用特点,不同类型的应 ... -
<oracle优化>(url收藏)
2015-02-11 22:18 7871. CBO & RBO Rule Based Opt ... -
<oracle-11> 数据类型
2015-02-08 20:06 2502选择一个正确的数据类 ... -
<oracle-10> 索引
2015-02-01 21:19 1981索引是应用设计和开发的一个重要方面。如果有太多的索引,修改(插 ... -
<oracle-9> 数据库表
2015-01-30 15:44 12789.1 表类型 Oracle主要有 ... -
<oracle-8> redo和undo
2015-01-26 22:23 1617本章介绍oracle数据库中 ... -
<oracle-7> 事务
2015-01-26 11:07 1515事务(transaction)是数 ... -
<oracle-6> 并发多版本控制
2015-01-12 21:17 14236.1 什么是并发控制 并 ... -
<oracle-5> 锁(lock)和闩(latch)
2015-01-07 21:11 2697开发多用户、数据库驱动的应用时,最大的难点之一是:一方面要力争 ... -
<oracle-4> oracle进程
2015-01-06 23:02 1359Oracle中的各个进程要完成某个特定的任务或一组任务,每个进 ... -
<oracle-3> 内存结构
2015-01-05 22:20 1511这一篇主要讨论oracle的3 ... -
<oracle-2> oracle文件
2014-12-22 20:57 1100与oracle实例相关的文件只有下面几种: 参数文件(para ... -
<Oracle-1> oracle体系结构概述
2014-12-21 22:02 1156本系列主要参考《Oracle ...
相关推荐
让Oracle跑得更快2基于海量数据的数据库设计与优化
让Oracle跑得更快基于海量数据的数据库设计与优化.谭怀远.第2版
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跑得更快2:基于海量数据的数据库设计与优化 谭怀远 清晰扫描版 带书签目录
让Oracle跑得更快基于海量数据的数据库设计与优化].谭怀远.第2版
( 让Oracle跑得更快 2 基于海量数据的数据库设计与优化.pdf )(清晰中文完整版)
让Oracle跑得更快(2):基于海量数据的数据库设计与优化 - 谭怀远。
海量数据处理,oracle数据库设计,优化性能
国内第一本真正意义上从工作经验出发,以作者的心得体会全面论述Oracle数据库性能优化的书籍。 作者内心经历的表白,站在全局角度对性能做分析,而不是拘泥于具体的技术细节,呈现给读者一种新的阅读思路。 书中...
第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 10g性能分析与优化思路内容简介:在这本书里读者将会学到作者在性能优化方面的一些思路和思考,一些故障处理的方法和原则,这些东西是作者在实践中长期积累的心得体会,当读者掌握了一些...
让oracle跑的更快PDF,供参考。读后再处理oracle会有不同感受。
很不错的一本书,自己学习用的,0下载积分分享给大家!
21天学通ORACLE pdf【】Oracle DBA手记3:数据库性能优化与内部原理解析【】Oracle_DBA突击__帮你赢得一份DBA职位【】Oracle优化日记一个金牌DBA的故事【】Oracle数据库管理艺术_11g新特性【】[让Oracle跑得更快基于...
我是你们的t-pengz,大家好啊,觉得你们的数据库运行慢吗,像蜗牛一样吗,不要着急,这本书,手把手教你,让你的oracle跑起来,dba必备
对影响oracle性能各个方面进行深入分析及怎么去优化,本资料对遇到性能问题及对想学习优化的朋友很有好处!
资源包含内容:ORACLE轻松入门;Oracle用户操作、赋权、事务、锁、索引资料;分区表专题;让Oracle跑得更快;让Oracle跑得更快2 基于海量数据的数据库设计与优化;性能调整之pga;性能调整之sga
之所以这里有一个新的轮子不是因为我懒得无事,而是我对目前基于传统RDB上Sharding框架的设计的理念不太恰当,虽然他们或许都很圆,跑的很快,但是使用不当的话,容易翻车。我期望的车轮是既能跑的快,但也能跑的稳...