`
liwenshui322
  • 浏览: 511576 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)Oracle性能优化 之 共享池

 
阅读更多

转载作品,原始出去如下:

 
 

一、共享池简介:

共享池的位置、各个部分及作用;

二、设定、查看共享池大小:

     在9i中我们用参数Shared_pool_size设置共享池的大小,10g中的设置我们下面再讲。另需注意,无论在9i还是10g中,Shared_pool_size参数的值都不一定代表共享池的真正大小,实际共享池大小会和此参数的值有一些出入。如果要查看共享池的大小,可以使用如下两种方式:

1)、使用Show sga

下面是Show sga的运行结果:

SQL> show sga

Total System Global Area  448790528 bytes

Fixed Size                  1249488 bytes

Variable Size              79695664 bytes

Database Buffers          360710144 bytes

Redo Buffers                7135232 bytes

     此命令显示了SGA各部分的大小。这其中Fixed size是固定区域,这块区域用于存贮一些管理他内存结构的管理性信息。DBA是不需要调节这块内存的。Database buffers是Buffer cache的大小。Redo buffers是重做缓存的大小。Variable Size是可变区域,共享池占了它约百分之八、九十的大小,它其中还包括Java池、大池等SGA除固定区、Buffer cache和重做缓存之外的所有其他池。另外,也有一些管理性信息在此可变区域中。比如我们经常使用的V$系统动态性能视图,就源自此可变区域中的管理性信息(V$的信息来自于X$,而X$中的数据来自于可变区域中的一些结构)。因为共享池占了可变区域的大部分,因此我们一般可以通过它来大概念的了解共享的大小。

     除Show Sga外,我们还可以用V$sgastat视图显示SGA各内存结构的大小,在此视图中,我们可以精确的看到共享池的大小,下面是这个视图的显示信息的样式:

SQL> select * from v$sgastat where rownum<=10;

POOL         NAME                            BYTES

------------ -------------------------- ----------

             fixed_sga                     1249488

             buffer_cache                360710144

             log_buffer                    7135232

shared pool  dpslut_kfdsg                      256

shared pool  hot latch diagnostics              80

shared pool  ENQUEUE STATS                    8360

shared pool  transaction                    264528

shared pool  KCB buffer wait statistic        3352

shared pool  invalid low rba queue             320

shared pool  KQF optimizer stats table        2396

……………………………………………………………………

……………………………………………………………………

     在10G中,这个视图显示600多行,所有POOL列不为空的行,就是可变区域的各个部分。POOL为空的行,从NAME列可以看到,分别是固定区域、Buffer cache和重做缓存。这三行的大小和Show sga中显示的大小是一样的。下面我们按POOL分组,看看可变区域中各内存池的大小:

SQL> select pool,sum(bytes)/1024/1024||' MB' from v$sgastat where pool is not null group by pool;

POOL         SUM(BYTES)/1024/1024||'MB'

------------ -------------------------------------------

java pool    4 MB

shared pool  64.00447845458984375 MB

large pool   4 MB

     可以看到可变区域中,有Java pool和Large pool,大小都是4MB,还有共享池大小为64MB多一点。将这三个池加起来,仍不到Show sga中显示的可变区域大小。那是因为除这三个池外,可变区域还有著如X$结构这样的管理性信息。

     这个视图可以用在9i和10g中,不过在10g中另有一个视图可以详细更准确的共享池大小方面的信息。下面我们来了解一下在10g中,对内存管理做了什么改进。

 

三、10g中设置共享池的大小:

     在10g中,共享池的简单设置更加方便,我们只需要定义SGA_TARGET参数的值,也就是目标SGA大小,Oracle就会根据此目标值自动设置共享池的大小。而且,如果发现共享池内存不够了,如果系统还有空闲的内存,Oracle将可以自动扩展共享池的大小。注意,我们刚才说了,这是共享池的简单设置,这种简单设置其实是根本不用设置。你只要告诉它SGA有多大,它可以自动设置SGA中的所有内存组件。这是10g相比9i的一大新特色,它使DBA的工作更加简单化了。Oracle本身越来越智能,再往下发展下去,很多人担心DBA会不会失业。因为软件越来越智能、越来越简单,总有一天将会淘汰掉DBA。持这种观点的人,大多数是对计算机了解的不够深入,当深入的学习下去之后,就会发现我们现在的人工智能水平是多么的幼稚可笑,这个话题我们就不在这里讨论了。有兴趣的同学可以去看看各种人工智能算法方面的书,如神经网络、遗传算法等等,自然就会明白我们当前的人工智能发展水平。回到我们本身的话题,不可否认,软件是向着智能化、自动化的方面发展,但是智能化程度越高,其本身也越复杂。就像人脑,复杂的多少科学家多少代的努力都无法完全了解其运作原理。这么复杂的系统一旦出现问题,需要程度更高的人,才可解决。比如汽车,由你自己驾驶,汽车出了毛病,很多地方都可以修。而我们的神舟火箭呢,它的运行轨道早就设置好的,它不需要飞行员亲自驾驶,自动化程度比汽车高了一大截。但是,神舟火箭要是出了问题呢,谁能修?我们数据库将来也是这样发展,随着智能化程度的提高,必将淘汰掉大批的初级DBA,但对高级DBA的需求,只会比以前更大。而且高级DBA的薪资水平,也会比以前更高。因为刚才我们已经说了,智能化水平越高,软件本身越复杂。越来越复杂的软件,对DBA的要求也一定会越来越高。就像我们正要讲的共享池,它的简单设置简单到不必再设置。但是,在确定了SGA_TARGET大小后,如果Oracle自动定义的共享池大小不合适怎么办,有很多时候我们不能完全依赖软件的智能,显然Oracle公司也清楚的明白这一点,因此,它还是保留了一些让DBA手动调整共享池等SGA内存组件的权利,10G下的调整比9i理解起来稍微复杂一点,下面我们说一下10g下共享池的调整注意事项。

在10g中还是要用Shared_pool_size参数调整共享池,但它已经不再是共享池大小的决定因素。在10g中它只决定了共享池最小有多大,也就是它是共享大小的下限。如果你将它设置为1G,那么Oracle绝不会分配低于1G内存的共享池。它可能正好按你的要求分配1G,也可能分配多于1G内存的共享池。通常,如果你使用此参数将共享池设置的比以前更大,那么这个设置将会马上生效。而如果你发现共享池有些大了,应该设置的更小些才合适,你用此参数将共享池设置的小了一些,那么这个设置将不会马上生效。为什么呢?因为此参数只是共享池大小的下限。你的共享池本来有1.5G,你将此参数设为了1G,Oracle会认为你只是想让共享池最小不要低于1G,那么当前共享池的大小1.5G满足你的要求,因此,Oracle不会调低共享池大小。什时候它自己也认为1.5G太大了,应该小一些,这时它才会将共享池调小。也就是说在10G中,Oracle加强了自身对共享池的掌控权,只保留给DBA设置下限的权力。

我们可以通过一个视图V$SGA_DYNAMIC_COMPONENTS来了解SGA中各内存组件的大小:

     步骤1:我先手动将shared_pool_size参数值设为50M:

SQL> alter system set shared_pool_size=50m;

系统已更改。

     步骤2:显示V$SGA_DYNAMIC_COMPONENTS视图:

SQL> SELECT COMPONENT,CURRENT_SIZE,MIN_SIZE,USER_SPECIFIED_SIZE from V$SGA_DYNAMIC_COMPONENTS;

COMPONENT                      CURRENT_SIZE   MIN_SIZE USER_SPECIFIED_SIZE

------------------------------ ------------ ---------- -------------------

shared pool                        92274688   92274688            54525952

large pool                          8388608    8388608             8388608

java pool                           4194304    4194304                   0

streams pool                              0          0                   0

DEFAULT buffer cache              247463936  243269632           209715200

KEEP buffer cache                         0          0                   0

RECYCLE buffer cache                      0          0                   0

DEFAULT 2K buffer cache                   0          0                   0

DEFAULT 4K buffer cache             8388608    8388608             8388608

DEFAULT 8K buffer cache                   0          0                   0

DEFAULT 16K buffer cache                  0          0                   0

 

COMPONENT                      CURRENT_SIZE   MIN_SIZE USER_SPECIFIED_SIZE

------------------------------ ------------ ---------- -------------------

DEFAULT 32K buffer cache                  0          0                   0

ASM Buffer Cache                          0          0           209715200

 

已选择13行。

这些列的意义我们简单介绍如下:

COMPONENT:SGA中内存组件的名称

CURRENT_SIZE:当前所占用内存大小

MIN_SIZE:通过分析资料,Oracle认为的该内存组件的最小大小

USER_SPECIFIED_SIZE:用户指定的大小。也就是DBA通过设置Shared_pool_size这些参数设置的大小。

上面是我在将shared_pool_size定为50M后的显示结果,从上面的结果可以看出来,USER_SPECIFIED_SIZE为52MB,因为内存是按块分配的,在10g中是4MB一个块,52M正好是13个内存块,Oracle没办法分配50M,因为50不能被4整除。从MIN_SIZE列可以看出,Oracle认为88M的共享池应该最小的共享池大小,因此CURRENT_SIZE列中记录的当前大小就是88MB。

 

     步骤3:继续实验,如果我调高共享池内存会怎样呢:

SQL> alter system set shared_pool_size=100m;

系统已更改。

将共享池内存设为100MB

 

     步骤4:显示结果

SQL> SELECT COMPONENT,CURRENT_SIZE,MIN_SIZE,USER_SPECIFIED_SIZE from V$SGA_DYNAMIC_COMPONENTS where COMPONENT='shared pool';

COMPONENT                      CURRENT_SIZE   MIN_SIZE USER_SPECIFIED_SIZE

------------------------------ ------------ ---------- -------------------

shared pool                       104857600   92274688           104857600

 

     这一次我只显示共享池,可以看到用户指定大小(USER_SPECIFIED_SIZE)已经是100MB了,当前大小也是100MB。Oracle认为的最小大小MIN_SIZE并没有变,还是88M,这是因为我们并没有进行太多的操作,Oracle认为数据库的负载并不重,最小大小因此没有增加。

     现在的共享池大小是100M,如果你将共享池大设定为88M,当前大小也不会马上变为88MB。因为shared_pool_size只是用来告诉Oracle用户希望共享池的最小大小是多少,但Oracle不会立即减小共享池。Oracle会在它认为合适的时候,减少共享池的大小。

 

四、共享池的调优:

共享池Miss比其他池大,应该调优库缓存

分享到:
评论

相关推荐

    Oracle数据库性能优化实务_共享池分析

    Oracle数据库性能优化实务_共享池分析

    Oracle性能优化求生指南

    , 本书作者凭借其20多年的丰富经验,为我们带来了一本系统的、全面的Oracle性能优化手册,用结构化方法帮助读者解决从数据库应用到数据库设计的所有问题。全书分为6部分、23章,实例丰富,兼具技术深度和广度,被...

    ORACLE SQL性能优化

    ORACLE SQL性能优化 通过init.ora文件中OPTIMIZER_MODE声明 RULE (基于规则) 所遵循的是Oracle内部预定的一些规则。比如当一个where子句中的一列有索引时去走索引。 COST (基于成本) 你必须经常运行analyze ...

    oracle性能优化(内部高级培训文档)

    1. 选用适合的ORACLE优化器 2. 访问Table的方式 a.全表扫描 b.通过ROWID访问表 3. 共享SQL语句 4. 选择最有效率的表名顺序(只在基于规则的优化器中有效) 5. WHERE子句中的连接顺序 。。。。。等等

    ORACLE 10G 性能优化

    主要内容:收集性能数据、优化SQL语句和应用程序、调整共享池(Shared Pool)的性能、调整缓冲区高速缓存(Buffer Cache)的性能、调整重做有关的性能、共享(多线程)服务器(MTS)、调整磁盘I/O的性能、调整闩(latch)和...

    Oracle性能优化求生指南-经典的很

    目前得到的一本算是能拿得出收的优化资源 大家共享下

    老方块ORACLE SQL性能优化(全)教学PPT

    性能管理 性能问题 调整的方法 SQL优化机制 应用的调整 SQL语句的处理过程 共享SQL区域 SQL语句处理的阶段 共享游标 SQL编码标准 Oracle 优化器介绍 SQL Tunning Tips 优化Tools

    oracle数据库的优化

    优化共享池: 错误!未定义书签。 优化数据字典高速缓存: 14 优化游标: 15 注释:以上增加SGA分配的调整以SGA不被换出实存为限,否则SGA部分换出实存反而降低Oracle性能。 15 优化数据库对象: 15 管理表的动态...

    Oracle性能优化

    本书作者凭借其20多年的丰富经验,为我们带来了一本系统的、全面的Oracle性能优化手册,用结构化方法帮助读者解决从数据库应用到数据库设计的所有问题。全书分为6部分、23章,实例丰富,兼具技术深度和广度,被读者...

    Oracle性能优化_数据库类

    Oracle性能优化的一些知识点,相信一定对你能有帮助。希望以后有好的资源大家共享。也希望大家能上传好的资源。

    ORACLE SQL性能优化系列(全)

    非常全面的ORACLE SQL性能优化介绍及实例:优化器的选择、共享SQL语句、访问Table的方式、减少访问数据库的次数、使用DECODE函数、减少对表的查询、通过内部函数提高SQL效率、用NOT EXISTS替代NOT IN、使用EXPLAIN ...

    oracle_sql性能优化

    Oracle sql 性能优化调整 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种...

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    第15章 RAC稳定性与性能优化 15.1服务器硬件 15.1.1 Firmware固件升级 15.1.2硬件设备兼容性 15.1.3 FC HBA卡冗余 15.1.4 Infiniband技术 15.1.5 RAC硬件结构案例 15.2操作系统 15.2.1认证操作系统 15.2.2...

    ORACLE SQL性能优化系列

    在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器. 2. 访问Table的方式 ORACLE 采用两种...

    Oracle_Database10g_性能调整与优化-第10章_使用PLSQL提高性能

    当PL/SQL被传递给Oracle之后,通常是放置在Oracle的系统全局区(SGA)中,特殊情况下会放置在共享池内。在Oracle中,PL/SQL的源代码可以以过程、函数、数据包,或者触发器的形式被存储在数据库中。一旦这些对象以编译...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part2.rar

    3.1 共享池中的latch争用 45 .3.2 数据缓冲池latch争用 54 3.2.1 表数据块 54 3.2.2 索引数据块 59 3.2.3 索引根数据块 62 3.2.4 段头数据块 65 第4章 优化器 66 4.1 rbo基于规则的优化器 66 4.2 cbo基于成本的优化...

    Oracle9i数据库系统优化与调整.pdf

    第6章 性能优化基础知识 第7章 系统优化方法 第二部分 ORACLE应用系统设计优化 第8章ORACLE数据库系统优化安装 第9章 项目分析、设计与管理 第10章 数据库结构设计要点 第三部分 ORACLE应用系统开发优化 第12...

    关于Oracle多表连接,提高效率,性能优化操作

    执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只要0.02秒,但是2张表联合统计就可能要几十表了. 这是因为ORACLE只对...

    Oracle SQL性能优化53点

    Oracle SQL性能优化53点: 1. 选用适合的ORACLE优化器 2. 访问Table的方式 3. 共享SQL语句 ...

Global site tag (gtag.js) - Google Analytics