oracle系统调优
在Oracle数据库系统中,起到调节作用的参数叫初始化参数,在Oracle 8i及以前的版本中,这些初始化参数记录在INITsid.ora文件中;而Oracle 9i/10g/11g中将这些参数记录在SPFILEsid.ora二进制文件中
基本参数:一组可调整的参数,如control_files,db_block_size,process
高级参数:一组精细调整的参数,如shared_servers
主要系统条优参数
参数 | 说明 |
buffer_pool_keep | 保留池大小(从db_block_buffers分配)目的是将对象保留在内存中,以减少I/O |
buffer_pool_recycle | 循环池大小(从db_block_buffers分配)目的是使用对象后将其清除,以便重复使用内存 |
control_file_record_keep_time | 控制文件中可重新使用部分中的记录必须保留的最短时间(天数) |
cursor_space_for_time | 在一个游标引用共享SQL区时,确定将SQL区保留在共享池中还是从中按过期作废处理 |
db_block_buffers | 缓冲区高速缓存中Oracle块中的数量,该参数会显著影响一个例程的SGA总大小 |
db_keep_cache_size | 指定keep缓冲池中的缓冲区数,keep缓冲池中的缓冲区大小是主要块大小(db_block_size) |
db_recycle_cache_size | 指定recycle缓冲池的大小,recycle池中的缓冲区大小是主要块大小(db_block_size) |
java_max_sessionsapce_size |
以字节为单位,指定可供在服务器中运行的Java程序所使用的最大内存量。它用于存储每次数据库 调用Java的状态。如果用户的会话持续时间超过了该值,则该会话会由于内存不足而终止 |
java_pool_size |
以字节为单位,指定Java存储池大小,它用于存储Java的方法和类定义在共享内存中的表示方法 以及调用结束时移植到Java会话空间的Java对象 |
large_pool_size |
指定大型池的分配堆得大型,它可被共享服务器用作会话内存,用作并行执行的消息缓冲区以及用 作RMAN备份和恢复的磁盘I/O缓冲区 |
log_buffer |
以字节为单位,指定在LGWR将重做日志条目写入重做日志文件之前,用于缓存这些条目的内存量。 重做条目保留对数据库块所作更改的一份记录。如果该值大于65536,就能减少重做日志文件I/O, 特别是在有长时间事物处理或大量事务处理的系统上 |
log_checkpoint_interval |
指定在出现检查点之前,必须写入重做日志文件的OS块(不是数据库块)的数量。无论该值如何, 在切换日志是都会出现检查点。较低的值可以缩短例程恢复所需的时间,但可能导致磁盘操作过多 |
log_checkpoint_timeout |
指定距下一个检查点出现的最大时间间隔(秒数)。将该时间指定为0,将禁用以时间为基础的 检查点。较低的值可以缩短例程恢复时间,但可能导致磁盘操作过量 |
max_dump_file_size |
指定每个跟踪文件的最大大小。如果担心跟踪文件会占用太多空间,可更改该限制。如果转储文件 可以达到操作系统允许的最大大小,请设置为“无限制” |
object_cache_max_size_percent |
指定会话对象的高速缓存增长可超过最佳高速缓存打下的百分比,最大大小等于最佳大小加上该 百分比与最佳大小的成绩。如果高速缓存大小超过了这个最大大小,系统视图调整到最佳大小 |
optimizer_index_caching |
调整基于成本的优化程序的假定值,即在缓冲区高速缓存中期望用于嵌套循环连接的索引块的百分比 它将影响使用索引的嵌套循环连接的成本。将该参数设置为一个较高的值,可以是嵌套循环连接相对 于优化程序来说成本更低 |
optimizer_index_cost_adj |
在考虑太多或太少索引访问路径的情况下,可以用来优化程序的性能。该值越低,优化程序越容易 选择一个索引。也就是说,如果将该值设置为50,索引访问路径的成本就是正常情况下的一半 |
query_rewrite_enabled |
启用或禁用实体化视图的查询重写。一个特定实体化视图只在如下条件下启用:会话参数和单独实体 化视图均已启用,并且基于成本的优化已启用 |
read_only_open_delayed |
用于加速某些操作,如:启动一个很大的数据库而其中大多数数据库存储在只读的表空间中。如果 设置为TRUE,从表空间中读取数据时,将首先访问只读表空间中的数据文件 |
shared_pool_reserved_size |
指定要为较大连续共享池内存请求而保留的空间,以避免由碎片引起的性能下降。该池的大小应符合 这样的条件,能存储为防止对象那从共享池刷新而普遍要求的所有大型过程和程序包 |
shared_pool_size |
以字节为单位,指定共享池的大小。共享池包含如:共享游标、存储过程、控制结构和并行消息缓冲 区等对象。较大的值能改善多用户系统的性能 |
sort_area_size |
以字节为单位,指定排序所使用的最大内存量。排序完成后,各行将返回,并且内存将释放。增大该 值可以提高大型排序的效率,如果超过了该内存量,将使用临时磁盘段 |
在进行系统优化时,可以使用alter system(整个数据库实例) /alter session(当前会话)
可以使用show parameter+参数名查看
系统全局区(SGA)优化
虽然11g增加了内存的自动调整
调整内存分配
一般内存的调整在应用程序和SQL语句做完调整后进行的。另外,建议用户在调整I/O前先调整内存分配。
调整日志缓冲区
如何记录日志文件呢?
方式一:使用逻辑的记录方式,也就是用描述性的语句记录整个变化过程。
如,对某个update,只记录delete旧值和insert新值
优点:节省空间
确定:一旦需要进行恢复就会非常消耗资源
方式二:使用物理记录方式,也就是说,把每个数据块的改变前的镜像和改变后的镜像都记录下来
优点:恢复速度快,
缺点:占用很大的磁盘空间
而Oracle在记录日志的方式上,采用了逻辑和物理相结合的方式。
查询当前Oracle实例的日志缓冲区大小
select distinct lebsz as 日志缓冲区大小 from x$kccle --必须以sys身份登录
插入知识介绍:x$表
x$表包含了特定实例的各方面信息,在不同版本的oracle版本中很可能是不一样的,时Oracle数据库的运行基础,包含当前的配置信息,连接实例的会话,以及丰富价值的性能信息。它并不是主流在数据库文件的永久或临时表
x$表仅仅驻留在内存中,当实例启动时,由Oracle应用程序动态创建,在内存中进行实时的维护。它们中的大多数至少需要装载或已经打开的数据库。x$表为sys用户所拥有,只读,x$表对于数据库来说很重要,所以不允许sysdba之外的用户直接访问,显示的授权也不被允许
调整共享池
主要组件有:
库缓存(library cache):主要缓存共享SQL和PL/SQL语句的相关信息
数据字典缓存(data dictionary cache):缓存数据字典表(dba_tables,dba_users)等信息,用于解释权限、表结构等
UGA(user globa area):在共享服务器模式下,当没有配置大池时(large_pool_size=0)UGA会占用共享池
在SGA中,首先应该考虑调整shared pool,调整shared pool时,应该首先集中在库缓存上。如果共享池很小时,会消耗很多CPU资源并引起竞争;如果共享池很大,会消耗很多内存资源,缓冲的内容较多,此时查找也会变得较缓慢
如:通过v$librarycache来查询当前实例的库缓存在调用阶段的“请求存取数”和“不命中数"
select sumj(pins) 请求存取数,sum(reloads) 不命中数 from v$librarycache;
一般来说,库高速缓冲总不命中数与总存取数之比应当接近0。当该比率如果接近或大于1%时,就应当立即采取措施减少这种不命中,通常有以下两种方法:
1.增加初始化参数shared_pool_size,提高库高速缓存中可用的内存数量,同时为了取得好的效果,还要增加初始化参数open_cursors的值,以提高对话允许的光标数。需要注意的是:为库缓存分配太多的内存可能引起调页或交换
2写等价的SQL语句,尽可能让SQL语句和PL/SQL块共享一个SQL区,以减少库缓存的不命中。SQL语句或PL/SQL块的文本每一个字符都必须等价,包括大小写和空格
v$rowcache查询数据字典高速缓存的活动状况
如:通过v$rowcache动态性能视图查询当前实例的数据字典高速缓存在调用阶段的“请求存取数”和“不命中数”
select sum(gets) 请求存取数,sum(getmisses) 不命中数 from v$rowcache;
一般来说,数据字典高速缓存总不命中数与总存取数之比应当接近0,改比率如果大于10%,甚至在应用过程中该比率还在增长,就应当立即通过增加shared_pool_size,以提高数据字典可用的内存数量,从而减少这种不命中。
v$sesstat v$statname查询Oracle收集对话信息使用的总内存统计
如:显示当前分配给所有会话的内存数
select sum(value)||'字节' 当前分配给所有会话的内存数
from v$sesstat,v$statname
where name='session uga memory' and v$sesstat.statistic#=v$statname.statistic#
/
本例:5273276字节
session uga memory用于显示分配给对话的内存字节数
如:显示曾经分配给所有会话的最大内存数
select sum(value)|| '字节' 曾经分配给所有会话的最大内存数
from v$sesstat,v$statname
where name='session uga memory max' and v$sesstat.statistic#=v$statname.statistic#
/
本例:9894388字节
调整数据库缓冲区
Oracle启动后不断地收集和统计数据存取的情况,并将其存放在v$sysstat中,
有:
db block gets:该统计值为数据请求的总数
consistent gets:该统计值为通过内存缓冲区存取既能满足的请求书
physical reads:该统计值为磁盘文件存取的总数
如:查询一段时间内v$sysstat表中的统计信息
select name,value from v$sysstat where name in('db block gets','consistent gets','physical reads')
/
计算缓冲区高速缓存的命中率可以使用
1-physical reads/(db block gets+consistent gets)
如果命中率还不错,可以适当减少初始化参数db_block_buffers的值减少高速缓存的大小,从而可以将省出来的内存用于其他Oracle内存结构。如果命中率低于70%,就会造成性能下降,这时应该立即通过增加初始化参数db_block_buffers的值(最大为65535)来增加缓冲区高速缓存的大小
排序区优化
系统使用专用的内存区域进行数据排序,这部分空间就是排序区。在Oracle中,用户数据的排序可使用两个区域:一个是内存排序区;另一个是磁盘临时段,系统优先使用内存排序区进行排序,如果内存不够,Oracle会自动使用磁盘临时表空间进行排序,为了提高数据库排序的速度,建议尽量使用内存排序区,而不使用临时段。sort_area_size用来设置排序区大小。
如果增大排序区则会提高大规模排序的性能,因为可以借此在查询处理期间在内存中执行排序。排序区的大小十分重要,因为某时用于每个连接的排序区仅有一个。此init.ora参数默认值通常为6-8个数据块的大小,此值通常主要用于OLTP操作,此时应该将其增大,以便执行决策支持操作、大批量操作,或者大量索引相关操作(如重建索引)。执行上述操作,应该调整下列init.ora参数:
sort_area_size=65535
sort_area_retained_size=65535
排序活动
排序是SQL语法中很小的方面,但却很重要,在Oracle的调整中,它常常被忽略。当使用create index,order by ,group by等语句时,Oracle数据库将自动执行排序的操作。通常,在以下情况Oracle会进行排序操作:
1.创建索引时
2.使用order by
3.使用group by
4.进行table join时,由于现有索引的不足而导致SQL优化器调用merge sort
当在Oracle实例中建立起一个session时,在内存中就会为session分配一个私有的排序区域。如果该连接是一个专用连接,那么就会根据init.ora中的sort_area_size参数的大小在内存中分配一个PGA.如果连接时通过多线程服务器建立的,那么排序的空间就在large_pool中分配。然而,对所有的session用做排序的内存量必须是一致的,不能为需要更大排序的操作分配额外的排序区域。因此,设计者必须做出平衡,在分配足够的排序区域以避免发生大的排序任务时出现磁盘排序的同时,对于那些并不需要进行很大排序的任务,就会出现浪费。当然,当排序的空间需求超出了sort_area_size所设置的大小时,将会在temp表空间中分页进行磁盘排序。磁盘排序要比内存排序大概慢14000倍
私有排序区域大小是由init.ora中的sort_area_size参数决定的。每个排序所占用的大小由init.ora中的sort_area_retained_size参数决定的。当排序不能在分配的空间中完成时,就会使用磁盘排序方式,即在Oracle实例中的临时表空间中进行
磁盘排序的开销是很大的,主要有以下几个原因:首先,与内存排序相比,磁盘排序特别慢,而其磁盘排序会消耗临时表空间的资源。其次,Oracle必须分配缓冲池以保持临时表空间中的块。无论何时,内存排序都比磁盘排序好,磁盘排序将会使任务变慢,并且会影响Oracle实例当前任务的执行。此外,过多的磁盘排序会使空闲缓存的等待(free buffer waits)值变得很高,从而令其他任务的数据块由缓冲区移走。
专用模式下排序区的调整
PGA内部不同部分的分配
内存区 | 专有服务 |
会话内存 | 私有的 |
永久所在区域 | PGA |
select语句运行所在区域 | PGA |
dml/ddl运行所在区域 | PGA |
参数:
sort_area_size:
除非在共享模式下,一般不推荐设置该参数,而推荐使用pga_aggregate_target进行PGA内存自动管理。如果需要设置此参数,可以考虑设置在1-3MB之间
sort_area_retained_size:
它指定了在排序操作完成后,继续保留在uga(用户全局区)内存的最大大小,以维护内存中的排序,直到所有数据行被返回才释放(,sort_area_size在排序完成,数据行返回之前被释放)回uga(不会被操作系统回收)。
sort_area_retained_size在共享服务中是从SGA中分配的(因为此时uga是从sga中分配的),在专用服务模式中是从pga中分配的,而sort_area_size无论在哪种模式下都从pga中分配
同样设置了pga_aggregate_target后,该参数无效
当连接处于空闲时,后台进程PMON每隔一段时间,就会测试用户的连接状况,如果连接已断开,PMON会清理现场,释放相关的资源。专用连接相当于一对一的连接,能够快速响应用户的请求。当然,连接时,首先要创建pga,参数pga_aggregate_target决定可以由所有服务器进程使用的内存的总量,参数workarea_size_policy决定采用手动管理还是自动管理
连接的方式:专用连接和共享连接
共享模式下排序区的调整
对于长事务或大事务,使用专用连接,可以有效提高系统的性能,减少用户等待和事务的排队,提高系统的利用率;对于超短事务和短事务、小事务,使用专用连接,而对于网站等可以使用共享连接。
在共享连接中,sort_area_size将在SGA的large_pool中分配
共享连接和长事务时背道而驰(长而大的OLTP)的
oracle系统调优的更多相关文章
- Oracle 系统调优
一:前言 一:调整初始化参数 1: Oracle 初始化参数分类 2:主要系统调优参数介绍 二:系统全局区 sga 优化 1:调整内存分配 2:调整日志缓冲区 1:查询当前oracle 实例的日志缓冲 ...
- 吴裕雄--天生自然ORACLE数据库学习笔记:Oracle系统调优
--修改 alter system set large_pool_size=64m; --显示 show parameter large_pool_size; select sum(getmisses ...
- Oracle SQL 调优健康检查脚本
Oracle SQL 调优健康检查脚本 我们关注数据库系统的性能,进行数据库调优的主要工作就是进行SQL的优化.良好的数据架构设计.配合应用系统中间件和写一手漂亮的SQL,是未来系统上线后不出现致命性 ...
- Sybase数据库应用系统调优的五大领域
Sybase数据库应用系统调优的五大领域 2011/3/14/13:49来源:慧聪it网 本 文以“某大型商业银行的网上银行系统”这一很具有典型意义的企业级大型Sybase数据库应用系统为例,涉及了数 ...
- 大数据集群Linux CentOS 7.6 系统调优篇
大数据集群Linux CentOS 7.6 系统调优篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.设置主机hosts文件 1>.修改主机名 [root@node100 ...
- Linux系统调优1
Linux在进行系统调优的时候,首先要考虑整个操作系统的结构,然后针对各个部分进行优化,下面展示一个Linux系统的各个组成部分: 有上图可以看出,我们可以调整的有应用程序,库文件,内核,驱动,还有硬 ...
- Oracle SQL调优记录
目录 一.前言 二.注意点 三.Oracle执行计划 四.调优记录 @ 一.前言 本博客只记录工作中的一次oracle sql调优记录,因为数据量过多导致的查询缓慢,一方面是因为业务太过繁杂,关联了太 ...
- fuse3 编译相关简要记录 与 fuse3 系统调优;
下面是在使用fuse3 编译bbfs 过程中一些参数,用于备忘: FUSE_CFLAGS="-I/usr/local/include/fuse3" FUSE_LIBS=" ...
- Linux低延迟服务器系统调优
最近做了一些系统和网络调优相关的测试,达到了期望的效果,有些感悟.同时,我也发现知乎上对Linux服务器低延迟技术的讨论比较欠缺(满嘴高并发现象):或者对现今cpu + 网卡的低延迟潜力认识不足(动辄 ...
随机推荐
- w3c之js学习总结
①JavaScript:改变 HTML 内容 <p id="demo">JavaScript 能改变 HTML 元素的内容.</p> <script& ...
- [UWP]CompositionLinearGradientBrush加BlendEffect,双倍的快乐
原文:[UWP]CompositionLinearGradientBrush加BlendEffect,双倍的快乐 1. 什么是BlendEffect# 上一篇文章介绍了CompositionLinea ...
- input check复选框选择后修改<a>标签超链接href
1. 给复选框添加onclick事件 获取标签id <tbody> <c:forEach var="file" items="${files}" ...
- MongoDB的使用学习之(四)权限设置--用户名、密码、端口==
本文参照:http://hi.baidu.com/tianhuimin/item/590d96cfd7ac1509c610b26a 本人也是按照此文章操作的,但是有些不妥,红色文字就是我实践后,需要改 ...
- lilybbs-faq - linux入门以及百合 Linux 版精华区导读
QUESTIONS 问题与解答 不需要任何命令的简单介绍 历史 (APUE 提到了1990年之前的unix历史,还有各种标准 ANSI ISO IEEE posix xpg3.... 但是linux ...
- 关于阅读Struts2部分拦截器源码的记录
Struts2中的拦截器在ActionInvocation对象的invoke()方法中执行. ActionInvocation对象从配置文件中读取Interceptor对象,加入到自己的存取拦截器的容 ...
- 微信授权获取code/openid
微信网页授权 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域名的说明 1.在微信公众号请求用户网页授权之前,开发者需要 ...
- Python核心技术与实战——四|Python黑箱:输入与输出
抽象的看,Python程序可以被看成一个黑箱:通过输入流将数据送达,经过处理后在输入,也就是说具备了一个图灵机运作的必要条件. 输入输出基础 最简单的输入是来自键盘的操作 name = input(' ...
- expect自动远程拷贝脚本
expect自动远程拷贝脚本,利用rsync命令,脚本内容如下: #!/usr/bin/expect -- proc Usage_Exit {self} { puts "" put ...
- 模拟输入(ADC-A0)
ESP8266具有内置的10位ADC,只有一个ADC通道(A0引脚),即只有一个ADC输入引脚可读取来自外部器件的模拟电压 ESP8266上的ADC通道和芯片供电电压复用,也就是说我们可以将其设置为测 ...