IT开放社区

共享池(Shared Pool)内存结构

享池(Shared Pool)的内存结构的分析和应用,在 SGA 的分配应用以及 oracle 数据库性能优化中有很大的意义,所以来搞事情吧。

Shared Pool.png

上图为共享池内存结构图

   共享池   

       用于存放SQL语句、PL/SQL代码、数据字典、资源锁和其他控制信息。它由初始化参数 SHARED_POOL_SIZE 控制其大小。它包含以下几个缓冲区:

  • 库缓存(Library Cache

  • 数据字典缓存(Data Dictionary Cache

  • 服务器结果缓存(Server Result Cache

  • 预留池(Reserved Pool

   库缓存   

当执行 SQL 语句时,数据库将尝试重用先前执行的代码。如果一个 SQL 语句的解析存在于库缓存中并且可以共享,那么数据库将重用这段代码,称为软解析库缓存命中。否则,数据库必须构建应用程序代码的新可执行版本,称为硬解析库缓存未命中

  • 共享 SQL 区域(Shared SQL Area

为了不重复解析完全相同的 SQL 语句,在第一次解析之后,Oracle将解析后的 SQL 语句存储在共享 SQL 区域。所有用户都可以访问该区域,并包含语句分析树和执行计划。

       1. 解析 SQL 语句(Parsed SQL Statements);

       2. SQL 执行计划(SQL Execution Plans);

       3. 解析和编译的pl/sql程序单元(Parsed and Compiled PL/SQL Program Units)。

SQL共享要求 SQL 语句在文本上必须完成相同,包括空格、换行、大小写都必须完全相同。通过以下实验来验证这一点:

1. 首先清空共享池;

SYS@itkf> alter system flush shared_pool;
System altered.

2. 切换至 SCOTT 用户下,并执行如下5次查询;

SYS@itkf> conn scott/tiger 
Connected.
Session altered.
SCOTT@itkf> select * from emp where empno = 7839;
     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10
SCOTT@itkf> select * from EMP where empno = 7839;
     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10
SCOTT@itkf> select * from emp where empno=7839;
     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10
SCOTT@itkf> select * 
  2  from emp
  3  where empno = 7839
  4  ;
     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10
SCOTT@itkf> select * from emp where empno = 7839;
     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10

可以发现以上5次查询,得到了相同的结果。

3. 切换回 SYS 用户,查看5次查询 SQL 语句是否被共享;

SCOTT@itkf> conn / as sysdba
Connected.
Session altered.
SYS@itkf> col SQL_TEXT for a90
SYS@itkf> select sql_id,child_number,sql_text from v$sql where parsing_schema_name = 'SCOTT';
SQL_ID        CHILD_NUMBER SQL_TEXT
------------- ------------ ------------------------------------------------------------------------------------------
2qy6kzx420vfp            0 select * from emp where empno = 7839
0xpdbm2z45p3p            0 select * from emp where empno=7839
5ygr3mb6cq8bv            0 select * from emp where empno = 7839
ccdkrv6ktrvqk            0 select * from EMP where empno = 7839
9 rows selected.

可以发现:1、5语句完全相同,所以第5次查询共享了第一次的 SQL 语句;2、3、4次查询未与第一次查询 SQL 语句共享,未能共享的原因是:空格、换行和大小写不同。

  • 私有 SQL 区域(Private SQL Area

每个发布 SQL 语句的会话在其 PGA 中都有一个私有 SQL 区域。提交相同语句的每个用户都有一个指向相同共享 SQL 区域的私有 SQL 区域。因此,单独的 PGA 中的许多私有 SQL 区域可以与相同的共享 SQL 区域相关联。私有 SQL 区域的位置取决于为会话建立的连接。如果会话通过共享服务器模式连接,则私有 SQL 区域的一部分保存在 SGA 中。

共享SQL区域和私有SQL区域.jpg

上图为共享SQL区和私有SQL区的运行关系

   数据字典缓存   

用于存储经常使用的数据字典信息。比如(表的定义、用户名、口令、权限、数据库的结构等)。Oracle 运行过程中经常访问该缓存以便解析 SQL 语句,确定操作的对象是否存在,是否具有权限等。如果不在数据字典缓存中,服务器进程就从保存数据字典信息的数据文件中将其读入到数据字典缓存中。数据字典缓存中保存的是一条一条的记录(就像是内存中的数据库),而其他缓存区中保存的是数据块信息。

   服务器结果缓存   

与缓冲池不同, 服务器结果缓存保存结果集而不保留数据块。服务器结果缓存包含共享相同基础结构的 SQL 查询结果缓存和 PL / SQL 函数结果缓存。

  • SQL 查询结果缓存

数据库可以将查询和查询片段的结果存储在 SQL 查询结果缓存中,如果我们用 SELECT 重复运行相同的语句。结果已被缓存,那么数据库会立即返回它们。通过这种方式,数据库避免了重新读取块和重新计算结果的昂贵操作。所以,SQL 共享是一个非常有效的性能优化手段

  • PL/SQL 函数结果缓存

与 SQL 查询结果缓存有相同的效果。

   预留池   

Java,PL / SQL 或 SQL 游标可能会使共享池中的分配大于5 KB。为了使这些分配减少由于碎片而导致连续内存不足的可能性,数据库将为保留池分配少量的共享池。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

网站分类
站点信息
  • 文章总数:119
  • 页面总数:2
  • 分类总数:3
  • 标签总数:12
  • 评论总数:2
  • 浏览总数:116129
友情链接

BlogPowerBy Z-BlogPHP 1.5 Zero ;Theme By 爱墙纸

Copyright © 2020-2030 ITkaifang.COM All Rights Reserved. 京ICP备13044647号.Email:dreamerqin@qq.com