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...

面试题 相关文章推荐
JMS中Topic和Queue有什么区别
May 15 面试题
简单介绍Object类的功能、常用方法
Oct 02 面试题
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
May 23 面试题
新大陆软件面试题
Nov 24 面试题
成都思必达公司C#程序员招聘面试题
Jun 26 面试题
EJB timer的种类
Oct 28 面试题
EJB面试题
Jul 28 面试题
Python如何实现单例模式
Jun 03 面试题
sleep()方法和wait()方法的区别是什么
Nov 17 面试题
编程输出如下图形
Nov 24 面试题
Java如何支持I18N?
Oct 31 面试题
J2EE面试题
Mar 14 面试题
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
php中AES加密解密的例子小结
2014/02/18 PHP
使用ltrace工具跟踪PHP库函数调用的方法
2016/04/25 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
php7性能提升的原因详解
2019/10/13 PHP
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
Java 正则表达式学习总结和一些小例子
2012/09/13 Javascript
js获取网页高度(详细整理)
2012/12/28 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
js仿百度有啊通栏展示效果实现代码
2013/05/28 Javascript
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
js密码强度校验
2015/11/10 Javascript
js防阻塞加载的实现方法
2016/09/09 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
vue1.0和vue2.0的watch监听事件写法详解
2018/09/11 Javascript
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
2019/07/25 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
python3使用tkinter实现ui界面简单实例
2014/01/10 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
对Django中的权限和分组管理实例讲解
2019/08/16 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
流行文化收藏品:Sideshow(DC漫画,星球大战,漫威)
2019/03/17 全球购物
中青班党性分析材料
2014/02/16 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
SQLServer2008提示评估期已过解决方案
2021/04/12 SQL Server
总结Python使用过程中的bug
2021/06/18 Python