Oracle内存组件理论篇一
目标
1.SGA结构
2.PGA结构
1.SGA
Shared pool
1)、共享池是对SQL、PL/SQL程序进行语法分析、编译、执行的内存区域。
在执行SELECT * FROM emp语句时,会对sql语句进行语法分析->编译->生成执行计划->运行执行计划等,这些操作都在共享池中完成;
如果再次执行SELECT * FROM emp语句时,会在共享池中查找是否有相同的sql,如果存在则省去编译、生成执行计划操作步骤而是直接运行执行计划。
因此养成良好的编码习惯对于提高oracle执行效率非常有帮助。
2)、共享池由库缓存和数据字典缓存组成。
3)、共享池的大小直接影响数据库的性能。
Database buffer cach
1)、用于存储从磁盘数据文件中读入的数据,所有用户共享。
2)、服务器进程将读入的数据保存在数据缓冲区中,当后续的请求需要这些数据时可以在内存中找到,不需要再从磁盘读取,提高了读取速度。
3)、数据缓冲区的大小对数据库的读取速度有直接的影响。
4)、硬盘上的数据文件中的数据,如何返回给用户的?
i、从硬盘取出来,直接返回给用户,使得获取数据的效率非常低。
ii、从硬盘取出来,放到数据缓冲区,从数据缓冲区中把数据返回给用户。下次读取同样的数据的话,直接从数据缓冲区中获取,不需要再从硬盘获取。
Redo log buffer
1)、日志记录数据库的所有修改信息,日志信息首先产生于日志缓冲区。
2)、当日志缓冲区的日志数据达到一定数量时,由后台进程将日志数据写入日志文件中。
3)、相对来说,日志缓冲区对数据库的性能影响较小。
eg、UPDATE emp SET empno=7935 WHERE empno=7934;
首先 在日记缓冲区中被记录,
其次 某个时候(三种情况;一、日志缓冲区中的记录达到1M 二、每隔3秒 三、日志缓冲区已经用了三分之一,满足其中任意一项就可以)把日志缓冲区中的这些记录写到在线日志中去。
Large pool
为了进行大的后台进程操作而分配的内存空间,主要指备份恢复、大型IO操作、并行查询等。
Stream pool
为了stream应用而分配的内存空间,高级复制技术一部分。
JAVA pool
为了java应用而分配的内存空间。
缓冲池:
Keep buffer pool
此池用于保留内存中可能要重用的对象,将这些对象保留在内存中可减少 I/O操作。
通过使池的大小大于分配给该池的各个段的总大小,可以将缓冲区保留在此池中,这意味着缓冲区不必执行过期处理。可
通过指定DB_KEEP_CACHE_SIZE参数的值来配置
Recycle buffer pool
此池用于内存中重用几率很小的块,回收池的大小要小于分配给该池的各个段的总大小,这意味着读入该池的块经常需要在缓冲区内执行过期处理。
可通过指定DB_RECYCLE_CACHE_SIZE 参数的值来配置
nK buffer pool
此池始终存在。它相当于没有保留池和回收池的实例的缓冲区高速缓存,可通过DB_CACHE_SIZE 参数进行配置。
注:保留池或回收池中的内存不是默认缓冲池的子集
CREATE INDEX cust_idx …
STORAGE (BUFFER _POOL KEEP);
ALTER TABLE oe.customers
STORAGE (BUFFER_POOL RECYCLE);
ALTER INDEX oe.cust_lname_ix
STORAGE (BUFFER _POOL KEEP);
BUFFER_POOL 子句用于定义对象的默认缓冲池。它是STORAGE子句的一部分,对CREATE 和ALTER表、集群和索引语句有效。未明确设置缓冲池的对象中的块将进入默认缓冲池。
语法为:BUFFER_POOL [KEEP | RECYCLE | DEFAULT] 。
2.PGA
共享连接模式和专用连接模式,PGA的管理方式不同。大多情况下,采用专用连接模式
专用SQL区 发出SQL 语句的每个会话都有一个专用SQL 区。
提交同一SQL 语句的每个用户也都有其自己的专用SQL 区,该专用SQL 区使用一个共享SQL 区。这样,许多专用SQL 区可与同一个共享SQL 区关联。
专用SQL 区的位置取决于为会话建立的连接类型。
如果会话是通过专用服务器连接的,则专用SQL 区位于该服务器进程的PGA 中。
如果会话是通过共享服务器连接的,则部分专用SQL 区将保留在SGA中
游标和SQL区 Oracle Pro*C 程序或Oracle 调用接口(OCI)程序的应用程序开发人员可以显式打开特定专用SQL 区的游标或句柄,并在该程序的整个执行过程中将它们用作命名资源。
数据库为某些SQL 语句隐式发出的递归游标也使用共享SQL 区。
工作区 对于复杂查询(例如,决策支持查询),会将大部分PGA 供内存密集型运算符分配的工作区专用。
例如:排序的运算符(ORDER BY 、GROUP BY),散列联接,位图合并,位图创建.
会话内存 会话内存是用于存放会话的变量(登录信息)以及与会话相关的其它信息的内存。
对于共享服务器,会话内存是共享的,而不是专用的。