Oracle性能调优原则


Posted in 面试题 onMay 03, 2012
任何事情都有它的源头,要解决问题,也得从源头开始,影响ORACLE性能的源头非常多,主要包括如下方面:

数据库的硬件配置:CPU、内存、网络条件

1. CPU:在任何机器中CPU的数据处理能力往往是衡量计算机性能的一个标志,并且ORACLE是一个提供并行能力的数据库系统,在CPU方面的要求就更高了,如果运行队列数目超过了CPU处理的数目,性能就会下降,我们要解决的问题就是要适当增加CPU的数量了,当然我们还可以将需要许多资源的进程 KILL掉;

2. 内存:衡量机器性能的另外一个指标就是内存的多少了,在ORACLE中内存和我们在建数据库中的交换区进行数据的交换,读数据时,磁盘I/O必须等待物理 I/O操作完成,在出现ORACLE的内存瓶颈时,我们第一个要考虑的是增加内存,由于I/O的响应时间是影响ORACLE性能的主要参数,我将在这方面进行详细的讲解

3. 网络条件:NET*SQL负责数据在网络上的来往,大量的SQL会令网络速度变慢。比如10M的网卡和100的网卡就对NET*SQL有非常明显的影响,还有交换机、集线器等等网络设备的性能对网络的影响很明显,建议在任何网络中不要试图用3个集线器来将网段互联。

OS参数的设置
下表给出了OS的参数设置及说明,DBA可以根据实际需要对这些参数进行设置
内核参数名
说明
bufpages
对buffer空间不按静态分配,采用动态分配,使bufpages值随nbuf一起对buffer空间进行动态分配。
Create_fastlinks
对HFS文件系统允许快速符号链接
dbc_max_pct
加大最大动态buffer空间所占物理内存的百分比,以满足应用系统的读写命中率的需要。
Dbc_min_pct
设置最小动态buffer空间所占物理内存的百分比
desfree
提高开始交换操作的最低空闲内存下限,保障系统的稳定性,防止出现不可预见的系统崩溃(Crash)。
Fs_async
允许进行磁盘异步操作,提高CPU和磁盘的利用率
lotsfree
提高系统解除换页操作的空闲内存的上限值,保证应用程序有足够的可用内存空间。
Maxdsiz
针对系统数据量大的特点,加大最大数据段的大小,保证应用的需要。(32位)
maxdsiz_64bit
maximum process data segment size for 64_bit
Maxssiz
加大最大堆栈段的大小。(32_bit)
maxssiz_64bit
加大最大堆栈段的大小。(64_bit)
Maxtsiz
提高最大代码段大小,满足应用要求
maxtsiz_64bit
原值过大,应调小
Minfree
提高停止交换操作的自由内存的上限
Shmem
允许进行内存共享,以提高内存的利用率
Shmmax
设置最大共享内存段的大小,完全满足目前的需要
Timeslice
由于系统的瓶颈主要反映在磁盘I/O上,因此 降低时间片的大小,一方面可避免因磁盘I/O不畅造成CPU的等待,从而提高了CPU的综合利用率。另一方面减少了进程的阻塞量。
Unlockable_mem
提高了不可锁内存的大小,使可用于换页和交换的内存空间扩大,用以满足系统对内存管理的要求。

用户SQL质量
以上讲的都是硬件方面的东西,在条件有限的条件下,我们可以调整应用程序的SQL质量:
1. 不要进行全表扫描(Full Table Scan):全表扫描导致大量的I/O
2. 尽量建好和使用好索引:建索引也是有讲究的,在建索引时,也不是索引越多越好,当一个表的索引达到4个以上时,ORACLE的性能可能还是改善不了,因为 OLTP系统每表超过5个索引即会降低性能,而且在一个sql 中, oracle 从不能使用超过 5个索引;当我们用到GROUP BY和ORDER BY时,ORACLE就会自动对数据进行排序,而ORACLE在INIT.ORA中决定了sort_area_size区的大小,当排序不能在我们给定的排序区完成时,ORACLE就会在磁盘中进行排序,也就是我们讲的临时表空间中排序, 过多的磁盘排序将会令 free buffer waits 的值变高,而这个区间并不只是用于排序的,对于开发人员我提出如下忠告:
1)、select,update,delete 语句中的子查询应当有规律地查找少于20%的表行.如果一个语句查找的行数超过总行数的20%,它将不能通过使用索引获得性能上的提高.
2)、索引可能产生碎片,因为记录从表中删除时,相应也从表的索引中删除.表释放的空间可以再用,而索引释放的空间却不能再用.频繁进行删除操作的被索引的表,应当阶段性地重建索引,以避免在索引中造成空间碎片,影响性能.在许可的条件下,也可以阶段性地truncate表,truncate命令删除表中所有记录,也删除索引碎片.
3)、在使用索引时一定要按索引对应字段的顺序进行引用。
4)、用(+)比用NOT IN更有效率。
降低ORACLE的竞争:
先讲几个ORACLE的几个参数,这几个参数关系到ORACLE的竞争:
1)、freelists 和 freelist 组:他们负责ORACLE的处理表和索引的空间管理;
2)、pctfree 及 pctused:该参数决定了freelists 和 freelist 组的行为,pctfree 和pctused 参数的唯一目的就是为了控制块如何在 freelists 中进出
设置好pctfree 及 pctused对块在freelists的移走和读取很重要。
其他参数的设置
1)、包括SGA区(系统全局区):系统全局区(SGA)是一个分配给Oracle 的包含一个 oracle 实例的数据库的控制信息内存段。
主要包括数据库高速缓存(the database buffer cache),
重演日志缓存(the redo log buffer),
共享池(the shared pool),
数据字典缓存(the data dictionary cache)以及其它各方面的信息
2)、db_block_buffers(数据高速缓冲区)访问过的数据都放在这一片内存区域,该参数越大,Oracle在内存中找到相同数据的可能性就越大,也即加快了查询速度。

3)、share_pool_size (SQL共享缓冲池):该参数是库高速缓存和数据字典的高速缓存。

4)、Log_buffer (重演日志缓冲区)

5)、sort_area_size(排序区)

6)、processes (同时连接的进程数)

7)、db_block_size (数据库块大小):Oracle默认块为2KB,太小了,因为如果我们有一个8KB的数据,则2KB块的数据库要读4次盘,才能读完,而8KB块的数据库只要1次就读完了,大大减少了I/O操作。数据库安装完成后,就不能再改变db_block_size的值了,只能重新建立数据库并且建库时,要选择手工安装数据库。
8)、open_links (同时打开的链接数)
9)、dml_locks
10)、open_cursors (打开光标数)
11)、dbwr_io_slaves (后台写进程数)

Tags in this post...

面试题 相关文章推荐
抽象方法、抽象类怎样声明
Oct 25 面试题
C语言笔试集
Jul 24 面试题
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
Oct 03 面试题
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
Nov 09 面试题
北京天润融通.net面试题笔试题
Feb 20 面试题
请解释在new与override的区别
Oct 29 面试题
某公司C#程序员面试题笔试题
May 26 面试题
Java面试题:Java类的Main方法如果是Private将会怎么样
Aug 18 面试题
Java语言程序设计测试题选择题部分
Apr 03 面试题
Java中的异常处理机制的简单原理和应用
Apr 27 面试题
送给程序员的20个Java集合面试问题
Aug 06 面试题
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
Oct 22 面试题
ORACLE十问
Apr 20 #面试题
ORACLE第二个十问
Dec 14 #面试题
一道写SQL的面试题和答案
Nov 19 #面试题
一个SQL面试题
Aug 21 #面试题
存储过程和sql语句的优缺点
Jul 02 #面试题
IMPORT的选项IGNORE有什么作用?缺省是什么设置?
Sep 17 #面试题
Oracle里面常用的数据字典有哪些
Feb 14 #面试题
You might like
Discuz! Passport 通行证整合
2008/03/27 PHP
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
php安全配置 如何配置使其更安全
2011/12/16 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
node.js中的path.normalize方法使用说明
2014/12/08 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
jQuery事件详解
2017/02/23 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
Node.js实现一个HTTP服务器的方法示例
2019/05/13 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
详解Vue2.5+迁移至Typescript指南
2019/08/01 Javascript
vue中 this.$set的用法详解
2019/09/06 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
详解jQuery中的prop()使用方法
2020/01/05 jQuery
vue 解决setTimeOut和setInterval函数无效报错的问题
2020/07/30 Javascript
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
在漏洞利用Python代码真的很爽
2007/08/26 Python
使用Python3中的gettext模块翻译Python源码以支持多语言
2015/03/31 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
Python调用服务接口的实例
2019/01/03 Python
python执行精确的小数计算方法
2019/01/21 Python
pycharm 安装JPype的教程
2019/08/08 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
如何安装2019Pycharm最新版本(详细教程)
2019/09/26 Python
Python类的继承super相关原理解析
2020/10/22 Python
想学画画?python满足你!
2020/12/24 Python
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
迟到检讨书900字
2014/01/14 职场文书
酒店管理专业自荐信
2014/05/23 职场文书
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python