作者:dbtan |【转载时请以超链接形式标明文章出处作者信息】


Shared Pool 的基本原理:

Shared Pool是Oracle SGA设置中最复杂也是最重要的一部分内容,Oracle通过Shared Pool来实现SQL共享、减少代码硬解析等,从而提高数据库的性能。在某些版本中,如果设置不当,Shared Pool可能会极大影响数据库的正常运行。

在Oracle 7 之前,Shared Pool并不存在,每个Oracle连接都有一个独立的Server进程与之相关联,Server进程负责解析和优化SQL和PL/SQL代码。典型的,在OLTP环境中,很多代码具有相同或类似的结构,反复的独立解析浪费了大量的时间以及资源,Oracle最终认识到这个问题,并且从PL/SQL开始尝试把这部分可共享的内容进行独立存储和管理,于是Shared Pool作为一个独立的SGA组件开始被进入,并且其功能和作用被逐渐完善和发展起来。

在这里注意到,Shared Pool最初被引入的目的,也就是它的本质功能在于实现共享。如果用户的系统代码是完全异构的(假设代码从不绑定变量,从不反复执行),那么就会发现,这时候Shared Pool完全就成了一个负担,它在徒劳无功地进行无谓的努力:保存代码、执行计划等待重用,并且客户端要不停的获取Latch,试图寻找共享代码,却始终一无所获。如果真的如此,那这是我们最不愿看到的情况,Shared Pool变得有害无益。当然这是极端的,可是在性能优化中我们发现,大多数性能低下的系统都存在这样的通病:代码极少共享,缺乏或从不实行变量绑定。优化这些系统的根本方法就是优化代码,使代码(在保证性能的前提下)可以充分共享,减少无谓的反复硬/软解析

实际上,Oracle引入Shared Pool就是为了帮助我们实现代码的共享和重用。了解了这一点之后,我们在应用开发的过程中,也应该有意识地提高自己的代码水平,以期减少数据库的压力。这应该是对开发人员最基本的要求。

Shared Pool主要由两部分组成,一部分是库缓存(Library Cache)另一部分是数据字典缓存(Data Dictionary Cache)Library Cache主要用于存储SQL语句、SQL语句相关的解析树、执行计划、PL/SQL程序块(包括匿名程序块、存储过程、包、函数等)以及它们转换后能够被Oracle执行的代码等,这部分信息可以通过v$librarycache视图查询至于Data Dictionary Cache主要用于存放数据字典信息,包括表、视图等对象的结构信息,用户以及对象权限信息,这部分信息相对稳定,在Shared Pool中通过字典缓存单独存放,字典缓存的内容是按行(Row)存储的(其他数据通常按Buffer存储),所以又被称为Row Cache,其信息可以通过v$rowcache查询

除了以上两个部分外,从Oracle Database 11g开始,在Shared Pool中划分了另外一块内存用于存储SQL查询的结果集,称为Result Cache Memory。以前Shared Pool的主要功能是共享SQL,减少硬解析,从而提高性能,但是SQL共享之后,执行同样可能消耗大量的时间和资源,现在Oracle尝试将查询的结果集缓存起来,如果同一SQL或PL/SQL函数多次执行(特别是包含复杂运算的SQL),那么缓存的查询结果可以直接返回给用户,不需要真正去执行运算,这样就又为性能带来了极大的提升。

- The End -