教学文章
Technology Exchange
热门课程
400电话

免费咨询热线
400-090-9964

教学文章

Shared Pool共享池(陈老师博客分享)

时间:2016-01-12 来源:

以往,Oracle SGA中最重要的内存区域算是共享池了,所以在内存调优中首先调的就是共享池,但是到了10g、11g、12c,共享池的调优就不是那么重要了,为什么呢?因为Oracle在对共享池的管理上越来越智能了,可以自动调整,但是不管怎么样,我们都要了解共享池的作用以及管理方式,有助于以后更深层的调整共享池。

下面是共享池的结构:


Oracle的共享池由两个组件组成:库缓冲区、数据字典缓冲区,这两部分的空间分配没有单独的参数来制定,只能由Oracle自动分配,所以我们如果要增加这两个组件的尺寸,就通过shared_pool_size参数增加共享池的尺寸就行了,根据规则,库缓冲区的空间分配优先。
下面我们看一下它的用处:
1、存储最新执行过的sql声明。
2、最近使用过的数据定义。
我们先说第一个用处,把sql声明保留下来做什么用,其实保留的是它的执行计划和执行代码,这样子第一次解析过后,以后再执行就不需要重新解析了,对于OLTP系统来说是至关重要的,因为OLTP类型的数据库每天会执行数以万计的sql语句,如果减少解析过程,可以很大的提高数据库性能。为什么减少了解析的过程,会提高性能呢?我们就来说说Oracle sql语句的执行过程:
一、parse(解析),这一步是最占用资源的,下面看看它的详细步骤:
1.1、从共享池的库缓冲区中查看是否该语句曾经执行过,如果是第一次执行,则进入下一步。如果之前曾经执行过,并且执行代码还存储在共享池中,则进入第4步,直接找到sql语句的执行代码去执行。
1.2、检查语法、查看对象的权限等等(这些内容会放在共享池的数据字典缓冲区中,该缓冲区存放的是最近访问过的对象的定义,来源于system表空间)。
1.3、解析过程中锁表(预防表的结构发生修改)。
1.4、Oracle 优化器根据对象的统计信息,基于代价的优化原则生成执行计划,编译并存储执行代码到共享池的库缓冲区,以便共享。
二、bind(绑定变量),如果sql语句有用到变量,则绑定变量。
三、execute(执行),根据执行计划执行sql语句。
四、fetch(提取),把结果返回给客户。
在上面过程中,第一步的解析占用资源最多,所以OLTP类型的数据库对于SQL语句能不能被共享,共享池的命中率的要求是很高的。我们在后面的调优文档中给大家介绍如何分配合适尺寸的共享池空间,以及如何共享sql语句。
第二个用处是存放最近访问过的对象定义,所谓的对象定义就是对象的结构、权限等等数据,访问过后就存储到共享池的数据字典缓冲区,这样子可以访问得更快,这些数据的定义都是存放在system表空间,可以怎么说,只要访问数据库的任何对象,都要访问数据字典,所以尽量在数据字典缓冲区找到对象的定义,减少对system表空间访问的压力,对于提高数据库的性能来说都是有很大的作用。


版权所有@北京神脑资讯技术有限公司(CUUG,中国UNIX用户协会) Copyright ALL Rights Reserved 京ICP备11008061号-1

CUUG旗下网站:www.cuug.com.cn www.cuug.com oracle.cuug.com bbs.cuug.com www.cuug.net

电话:010-59426307 010-59426319 邮政编码:100089

地址:北京市海淀区北清路164号28-38号院