<让oracle跑得更快-1> 引起数据库性能问题的因素

标签: oracle 数据库 性能 | 发表时间:2015-02-26 22:04 | 作者:
出处:http://www.iteye.com
此《让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推荐



相关 [oracle 数据库 性能] 推荐:

<让oracle跑得更快-1> 引起数据库性能问题的因素

- - ITeye博客
此《让oracle跑得更快》系列参考《让Oracle跑得更快 Oracle.10g性能分析与优化思路》.(谭怀远). 一个 数据库是否存在性能问题,基本上在 系统设计的时候就决定了,这里说的系统设计包含软件的设计,数据库的设计和硬件的设计. 软件的设计包含了软件系统架构的设计,软件代码的编写;数据库的设计包含了数据库的类型选择和根据数据库类型的所有数据库对象的设计;硬件的设计包括存储结构的设计,硬件的性能选择和冗余设计.

Oracle 发布 NoSQL 数据库

- 冷月 - 博客园新闻频道
  Oracle 作为全球最大的关系型数据库提供商,在其产品链条中,也加入了 NoSQL 数据库这一环,而且这个新的数据库名字很霸气,就叫 NoSQL Database,想起了当年新浪微博更换 weibo.com 域名之时的一个笑话:. 原来有三家人做面包,张三家的面包叫三张牌面包,李四家的牌子叫李四牌面包,王五家出品的是王五牌面包,而突然有一天,张三家的面包改名了,叫面包牌面包.

Oracle数据库备份

- - Oracle - 数据库 - ITeye博客
(一)、导出/导入(EXPORT/IMPORT).   EXPORT/IMPORT是用来将ORACLE中数据移出/移入数据库.   1、EXPORT将数据库中数据备份成一个二进制系统文件称为“导出转储文件”(EXPORT. DUMP FILE),并将重新生成数据库写入文件中.   a.用户模式:导出用户所有对象以及对象中的数据;.

Oracle数据库资源管理

- - 技术改变世界 创新驱动中国 - 《程序员》官网
一般来说,Oracle数据库都属于中大型的系统,这类系统的用户会话(Session),小则一两百,多则上千,这些用户会话要求Oracle数据库执行的任何指令都需要耗费系统资源,而系统资源毕竟是宝贵且有限的,一旦突然涌进大量的用户会话,对于有限的资源可能会略显不足. 但这些会话必定有轻重缓急之分,对于重要且紧急的用户会话需求理当获得多一点的系统资源,对于一些不重要或不紧急的用户会话,则可以使用较少的系统资源慢慢处理.

Oracle 数据库导入导出

- - CSDN博客推荐文章
使用 exp/imp 导入导出. 开始exp/imp之前, 有以下几点需要注意:. 1)此部分以 oracle 10g为例. 2)exp, imp 是操作系统下一个可执行的文件,存放在/ORACLE_HOME/bin目录下. 所以之间cmd 命令模式下执行就行了. (不需要先连接进sqlplus).

[Oracle] 数据库安全之 - Vault

- - CSDN博客推荐文章
Oracle用了整整一本书来阐述Valut,有兴趣的童鞋可以参考http://docs.oracle.com/cd/E11882_01/server.112/e23090/toc.htm,我个人觉得并不需要对它进行太深入的了解,只有知道有这么一回事就好了. 从宏观方面看,Vault属于Oracle数据库安全领域中-访问控制的部分,可参考《 [Oracle] 数据安全概述》.

Oracle数据库分析函数详解

- - MySQLOPS 数据库与运维自动化技术分享
Oracle数据库分析函数详解. 原创文章,转载请注明: 文章地址 Oracle数据库分析函数详解.

oracle 数据库体系结构

- - Oracle - 数据库 - ITeye博客
       任何硬件平台或操作系统下的ORACLE体系结构都是相同的,包括如下四个方面:.         数据文件,日志文件,控制文件,参数文件.         表空间、段、区间、数据块.         共享池,数据缓冲区,日志缓冲区,PGA.         用户进程、服务器进程、后台进程.

Oracle数据库日常检查

- - Oracle - 数据库 - ITeye博客
看数据库是否处于归档模式,并启动了自动归档进程. 执行df –k,检查有没有使用率超过80%的文件系统,特别是存放归档日志的文件系统. 检查alert_SID.log有无报错信息(ORA-600、ORA-1578)、ORA-60. 用imp工具生成建表脚本,看能否正常完成. 如果最大可用块(max_chunk)与总大小(total_space)相比太小,要考虑接合表空间碎片或重建某些数据库对象.

数据批量导入Oracle数据库

- - Oracle - 数据库 - ITeye博客
今天学习了一个新的东西,觉得还挺有意思的,也是从别出COPY 的,. SQL*LOADER是大型数据. 仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL). 现在,我们抛开其理论不谈,用实例来使. 您快速掌握SQL*LOADER的使用方法.   首先,我们认识一下SQL*LOADER.