Oracle 笔记(二) 共享池中的 查询结果高速缓存

来源:互联网 发布:淘宝代付没有支付宝 编辑:程序博客网 时间:2024/05/29 13:17

Oracle DB 处理PL/SQL 程序单元(过程、函数、程序包、匿名块和数据触发器)的方式与它处理单个SQL 语句的方式十分相似。Oracle DB 分配一个共享区域以存放程序单元经过语法分析和编译之后的形式。Oracle DB 分配一个专用区域,以便存放特定于运行程序单元的会话的值,包括局部变量、全局变量和程序包变量(也称为“程序包实例化”),并且存放用于执行SQL 的缓冲区。如果多个用户运行同一个程序单元,则所有用户都使用同一个共享区域,但维护其各自专用SQL 区域的单独副本,以便存放特定于其自身会话的值。


PL/SQL 程序单元中包含的单个SQL 语句的处理方式与其它SQL 语句的处理方式类似。无论这些SQL 语句在PL/SQL 程序单元中的来源如何,它们都使用共享区域来存放其语法分析表示,并且为运行语句的每个会话使用一个专用区域。SQL 查询结果高速缓存和PL/SQL 函数结果高速缓存是Oracle Database 11g 中新增的功能。它们共享相同的基础结构,出现在相同的动态性能(V$) 视图中,并且使用所提供的同一程序包进行管理。


查询的结果和查询片段的结果可以高速缓存在“SQL 查询结果高速缓存”的内存中。这样,数据库可以在以后执行这些查询和查询片段时使用高速缓存结果进行回答。由于从SQL 查询结果高速缓存中检索结果要比重新运行查询快得多,因此将频繁运行的查询的结果缓存起来可以大大提高这些查询的性能。


如果计算的输入是PL/SQL 函数发出的一个或若干个参数化查询,则有时会使用该函数来返回计算结果。在某些情况下,这些查询访问很少更改的数据(与调用函数的频率相比)。您可以在PL/SQL 函数的源文本中包括语法,以请求将函数结果缓存在“PL/SQL 函数结果高速缓存”中,并且在表列表中的表遇到DML 时清除高速缓存(以确保正确无误)。


补充:

SGA 的共享池部分包含库高速缓存、数据字典高速缓存、SQL 查询结果高速缓存、PL/SQL 函数结果高速缓存、并行执行消息的缓冲区以及控制结构。


“数据字典”是数据库表和视图(它们包含有关数据库、数据库结构及其用户的参考信息)的集合。在SQL 语句语法分析期间,Oracle DB 会频繁访问数据字典。该访问操作对于Oracle DB 的持续操作来说至关重要。


Oracle DB 对数据字典的访问十分频繁,因此在内存中指定了两个特殊的位置来存放字典数据。一个区域称为“数据字典高速缓存”,也称为“行高速缓存”,因为它以行的形式存放数据,而不是以缓冲区的形式存放数据(缓冲区用于存放完整的数据块)。内存中的另一个用于存放字典数据的区域称为“库高速缓存”。所有Oracle DB 用户进程都共享这
两个高速缓存以便访问数据字典信息。


Oracle DB 使用共享SQL 区域(以及PGA 中保留的专用SQL 区域)来表示它所运行的每个SQL 语句。Oracle DB 可识别两个用户执行相同SQL 语句的情况,从而为这些用户重用共享SQL 区域。

0 0
原创粉丝点击