此《让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. 存储的设计
在系统设计阶段,一定要预测系统预期的数据使用空间,否则以后数据库扩容将是一件非常麻烦的事情,特别是那些不允许宕机的系统,尤其应该将各种因素考虑清楚,最大可能地消除将来由于自身设计的问题导致的隐患。
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐