2022年OracleTuning的一些总结 .pdf
《2022年OracleTuning的一些总结 .pdf》由会员分享,可在线阅读,更多相关《2022年OracleTuning的一些总结 .pdf(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精品资料推荐1 Oracle Tuning的一些总结关于 Oracle 的性能调整,一般包括两个方面,一是指Oracle 数据库本身的调整,比如 SGA、 PGA 的优化设置,二是连接 Oracle的应用程序以及 SQL语句的优化。做好这两个方面的优化,就可以使一套完整的Oracle 应用系统处于良好的运行状态。本文主要是把一些Oracle Tuning的文章作了一个简单的总结,力求以实际可操作为目的,配合讲解部分理论知识,使大部分具有一般Oracle知识的使用者能够对 Oracle Tuning有所了解,并且能够根据实际情况对某些参数进行调整。关于更加详细的知识, 请参见本文结束部分所提及的
2、推荐书籍,同时由于该话题内容太多且复杂,本文必定有失之偏颇甚至错误的地方,请不吝赐教,并共同进步。1. SGA 的设置在 Oracle Tuning中, 对 SGA 的设置是关键。SGA , 是指 Shared Global Area , 或者是 System Global Area , 称为共享全局区或者系统全局区,结构如下图所示。对于 SGA 区域内的内存来说,是共享的、全局的,在UNIX 上,必须为oracle 设置共享内存段(可以是一个或者多个),因为oracle 在 UNIX 上是多进程;而在 WINDOWS上 oracle 是单进程(多个线程),所以不用设置共享内存段。1.1 SG
3、A 的各个组成部分下面用 sqlplus 查询举例看一下SGA 各个组成部分的情况:SQL select * from v$sga; NAME VALUE - - Fixed Size 104936 Variable Size 823164928 Database Buffers 1073741824 Redo Buffers 172032 或者SQL show sga Total System Global Area 1897183720 bytes Fixed Size 104936 bytes Variable Size 823164928 bytes Database Buffers
4、1073741824 bytes Redo Buffers 172032 bytes Fixed Size oracle 的不同平台和不同版本下可能不一样,但对于确定环境是一个固定的值,里面存储了 SGA 各部分组件的信息, 可以看作引导建立SGA 的区域。Variable Size 包含了 shared_pool_size、java_pool_size、large_pool_size 等内存设置Database Buffers 指数据缓冲区,在8i 中包含 db_block_buffer*db_block_size、精品资料 - - - 欢迎下载 - - - - - - - - - - -
5、欢迎下载 名师归纳 - - - - - - - - - -第 1 页,共 35 页 - - - - - - - - - - 精品资料推荐2 buffer_pool_keep、buffer_pool_recycle 三部分内存。在 9i 中包含db_cache_size、db_keep_cache_size、db_recycle_cache_size、db_nk_cache_size。Redo Buffers 指日志缓冲区, log_buffer。在这里要额外说明一点的是,对于v$parameter、v$sgastat、v$sga 查询值可能不一样。 v$parameter 里面的值,是指用户在
6、初始化参数文件里面设置的值,v$sgastat是 oracle 实际分配的日志缓冲区大小 (因为缓冲区的分配值实际上是离散的,也不是以 block 为最小单位进行分配的),v$sga 里面查询的值,是在oracle 分配了日志缓冲区后,为了保护日志缓冲区, 设置了一些保护页, 通常我们会发现保护页大小是8k( 不同环境可能不一样 )。参考如下内容SQL select substr(name,1,10) name,substr(value,1,10) value 2 from v$parameter where name = log_buffer; NAME VALUE - - log_buff
7、er 163840 SQL select * from v$sgastat where pool is null; POOL NAME BYTES - - - fixed_sga 104936 db_block_buffers 1073741824 log_buffer 163840 SQL select * from v$sga; NAME VALUE - - Fixed Size 104936 Variable Size 823164928 Database Buffers 1073741824 Redo Buffers 172032 172032 163840 = 8192 (以上试验数
8、据是在HP B.11.11 + Oracle 8.1.7.4 环境下得到的)1.2 SGA 的大小设置在对 SGA 的结构进行简单分析以后,下面是关于如何根据系统的情况正确设置 SGA 大小的问题。SGA 是一块内存区域, 占用的是系统物理内存, 因此对于一个 Oracle 应用系统来说, SGA 决不是越大越好,这就需要寻找一个系统优化的平衡点。1.2.1 设置参数前的准备在设置 SGA 的内存参数之前,我们首先要问自己几个问题一:物理内存多大二:操作系统估计需要使用多少内存三:数据库是使用文件系统还是裸设备精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载
9、 名师归纳 - - - - - - - - - -第 2 页,共 35 页 - - - - - - - - - - 精品资料推荐3 四:有多少并发连接五:应用是 OLTP 类型还是 OLAP 类型根据这几个问题的答案, 我们可以粗略地为系统估计一下内存设置。那我们现在来逐个问题地讨论, 首先物理内存多大是最容易回答的一个问题,然后操作系统估计使用多少内存呢?从经验上看,不会太多,通常应该在200M 以内(不包含大量进程 PCB)。接下来我们要探讨一个重要的问题,那就是关于文件系统和裸设备的问题,这往往容易被我们所忽略。操作系统对于文件系统,使用了大量的buffer 来缓存操作系统块。这样当数据
10、库获取数据块的时候,虽然SGA 中没有命中,但却实际上可能是从操作系统的文件缓存中获取的。而假如数据库和操作系统支持异步IO ,则实际上当数据库写进程DBWR 写磁盘时,操作系统在文件缓存中标记该块为延迟写,等到真正地写入磁盘之后,操作系统才通知DBWR 写磁盘完成。对于这部分文件缓存, 所需要的内存可能比较大, 作为保守的估计, 我们应该考虑在 0.2 0.3 倍内存大小。但是如果我们使用的是裸设备,则不考虑这部分缓存的问题。这样的情况下SGA 就有调大的机会。关于数据库有多少并发连接,这实际上关系到PGA 的大小( MTS 下还有large_pool_size)。事实上这个问题应该说还跟O
11、LTP 类型或者 OLAP 类型相关。对于 OLTP 类型 oracle 倾向于可使用 MTS, 对于 OLAP 类型使用独立模式,同时 OLAP 还可能涉及到大量的排序操作的查询,这些都影响到我们内存的使用。那么所有的问题综合起来,实际上主要反映在UGA 的大小上。 UGA主要包含以下部分内存设置SQL show parameters area_size NAME TYPE VALUE - - - bitmap_merge_area_size integer 1048576 create_bitmap_area_size integer 8388608 hash_area_size inte
12、ger 131072 sort_area_size integer 65536 SQL 在这部分内存中我们最关注的通常是sort_area_size,这是当查询需要排序的时候,数据库会话将使用这部分内存进行排序,当内存大小不足的时候, 使用临时表空间进行磁盘排序。由于磁盘排序效率和内存排序效率相差好几个数量级,所以这个参数的设置很重要。当出现大量排序时的磁盘I/O 操作时,可以考虑增加sort_area_size的值。sort_area_size是 Oracle 用于一次排序所需的最大内存数,在排序结束但是结果列返回之前, Oracle 会释放 sort_area_size大小的内存,但是会保
13、留sort_area_retained_size大小的内存,知道最后一行结果列返回以后,才释放所有的内存。会导致排序的语句有SELECT DISTINCT , MINUS , INTERSECT , UNION 和 min() 、max() 、count() 操作;而不会导致排序的语句有UPDATE , 带BETWEEN 子句的 SELECT 等等。这四个参数都是针对会话进行设置的,是单个会话使用的内存的大小, 而不是整个数据库使用的。偶尔会看见有人误解了这个参数以为是整个数据库使用的大小,这是极其严重的错误。假如设置了MTS ,则 UGA 被分配在精品资料 - - - 欢迎下载 - - -
14、- - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 3 页,共 35 页 - - - - - - - - - - 精品资料推荐4 large_pool_size,也就是说放在了共享内存里面,不同进程(线程)之间可以共享这部分内存。在这个基础上,我们假设数据库存在并发执行server process 为 100 个,根据上面我们4 个参数在 oracle8.1.7 下的默认值,我们来计算独立模式下 PGA 的大致大小。由于会话并不会经常使用create_bitmap_area_size 、bitmap_merge_area_size,所以我们通常不对四个
15、参数求和。 在考虑到除这四个参数外会话所保存的变量、堆栈等信息, 我们估计为 2M ,则 200 个进程最大可能使用200M 的 PGA。1.2.2 一个经验公式现在,根据上面这些假定, 我们来看 SGA 实际能达到多少内存。 在 1G 的内存的服务器上, 我们能分配给 SGA 的内存大约为 400 500M 。若是 2G 的内存, 大约可以分到 1G 的内存给 SGA, 8G 的内存可以分到 5G 的内存给 SGA 。当然我们这里是以默认的排序部分内存sort_area_size=64k进行衡量的,假如我们需要调大该参数和hash_area_size等参数,然后我们应该根据并发的进程的数量,
16、来衡量考虑这个问题。事实上,通常我们更习惯通过直观的公式化来表达这样的问题:OS 使用内存 +SGA+ 并发执行进程数*(sort_area_size+hash_ara_size+2M) 0.7*总内存(公式是死的,系统是活的,实际应用的调整不必框公式,这不过是一个参考建议) 在我们的实际应用中, 假如采用的是裸设备,我们可适当的增大SGA( 如果需要的话)。由于目前几乎所有的操作系统都使用虚拟缓存,所以实际上如果就算SGA 设置的比较大也不会导致错误,而是可能出现频繁的内存页的换入与换出(page in/out)。在操作系统一级如果观察到这个现象,那么我们就需要调整内存的设置。1.2.3 各
17、个参数的设置那么 SGA 中的各个参数具体应该按照什么样的原则来设置呢,下面进行讨论:log_buffer 对于日志缓冲区的大小设置,通常我觉得没有过多的建议,因为参考LGWR 写的触发条件之后,我们会发现通常超过3M 意义不是很大。作为一个正式系统,可能考虑先设置这部分为log_buffer=13M 大小,然后针对具体情况再调整。large_pool_size 对于大缓冲池的设置,假如不使用MTS ,建议在 20 30M 足够了。这部分主要用来保存并行查询时候的一些信息,还有就是RMAN 在备份的时候可能会使用到。 如果设置了 MTS, 则由于 UGA 部分要移入这里,则需要具体根据sess
18、ion最大数量和sort_ares_size 等相关会话内存参数的设置来综合考虑这部分大小的设置,一般可以考虑为session * (sort_area_size + 2M)。这里要提醒一点,不是必须使用MTS ,我们都不主张使用MTS,尤其同时在线用户数小于500 的情况下。java_pool_size 假如数据库没有使用JAVA ,我们通常认为保留10 20M 大小足够了。事实上可以更少,甚至最少只需要32k ,但具体跟安装数据库的时候的组件相关(比如http server)。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - -
19、 - - - - -第 4 页,共 35 页 - - - - - - - - - - 精品资料推荐5 shared_pool_size 这是迄今为止最具有争议的一部分内存设置。按照很多文档的描述, 这部分内容应该几乎和数据缓冲区差不多大小。但实际上情况却不是这样的。 首先我们要考究一个问题,那就是这部分内存的作用,它是为了缓存已经被解析过的SQL ,而使其能被重用,不再解析。这样做的原因是因为,对于一个新的SQL(shared_pool 里面不存在已经解析的可用的相同的SQL),数据库将执行硬解析,这是一个很消耗资源的过程。而若已经存在,则进行的仅仅是软分析(在共享池中寻找相同SQL ),这样
20、消耗的资源大大减少。所以我们期望能多共享一些 SQL ,并且如果该参数设置不够大, 经常会出现 ora-04031错误,表示为了解析新的 SQL ,没有可用的足够大的连续空闲空间,这样自然我们期望该参数能大一些。但是该参数的增大, 却也有负面的影响, 因为需要维护共享的结构,内存的增大也会使得SQL 的老化的代价更高,带来大量的管理的开销,所有这些可能会导致 CPU 的严重问题。在一个充分使用绑定变量的比较大的系统中,shared_pool_size 的开销通常应该维持在 300M 以内。 除非系统使用了大量的存储过程、 函数、 包, 比如 oracle erp 这样的应用,可能会达到500M
21、 甚至更高。于是我们假定一个1G 内存的系统,可能考虑设置该参数为100M ,2G 的系统考虑设置为150M,8G 的系统可以考虑设置为200 300M 。对于一个没有充分使用或者没有使用绑定变量系统,这可能给我们带来一个严重的问题。所谓没有使用bind var 的 SQL ,我们称为 Literal SQL 。也就是比如这样的两句 SQL 我们认为是不同的SQL, 需要进行 2 次硬解析:select * from EMP where name = TOM ; select * from EMP where name = JERRY ; 假如把 TOM 和 JERRY 换做变量 V,那就是使
22、用了 bind var ,我们可以认为是同样的 SQL 从而能很好地共享。共享SQL 本来就是 shared_pool_size 这部分内存存在的本意,oracle 的目的也在于此,而我们不使用bind var 就是违背了 oracle 的初衷,这样将给我们的系统带来严重的问题。当然,如果通过在操作系统监控,没有发现严重的cpu 问题,我们如果发现该共享池命中率不高可以适当的增加shred_pool_size。但是通常我们不主张这部分内存超过800M (特殊情况下可以更大)。事实上,可能的话我们甚至要想办法避免软分析,这在不同的程序语言中实现方式有差异。我们也可能通过设置session_cac
23、hed_cursors 参数来获得帮助(这将增大 PGA)关于使用绑定变量的话题,在下面的应用优化中继续讨论。Data buffer 现在我们来谈数据缓冲区,在确定了SGA 的大小并分配完了前面部分的内存后,其余的,都分配给这部分内存。通常,在允许的情况下,我们都尝试使得这部分内存更大。这部分内存的作用主要是缓存DB BLOCK ,减少甚至避免从磁盘上获取数据,在8i 中通常是由 db_block_buffers*db_block_size 来决定大小的。如果我们设置了buffer_pool_keep 和 buffer_pool_recycle,则应该加上后面这两部分内存的大小。可以看出,设置
24、 SGA 时基本上应该掌握的原则是:data buffer 一般可以尽可能的大精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 5 页,共 35 页 - - - - - - - - - - 精品资料推荐6 shared_pool_size 应该适度log buffer 在 1MB 以内就可以了假定 oracle是 32 bit ,服务器 RAM 大于 2G ,注意你的 PGA 的情况, ,则建议shared_pool_size + data buffer +large_pool_size + java_po
25、ol_size select * from v$version; BANNER - Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production PL/SQL Release 8.1.7.0.0 - Production CORE 8.1.7.0.0 Production TNS for 32-bit Windows: Version 8.1.7.0.0 - Production NLSRTL Version 3.4.1.0.0 Production 在 UNIX 平台下的显示有所不同,明显可以看出是64bit Oracle ,比如在HP
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年OracleTuning的一些总结 2022 OracleTuning 一些 总结
限制150内