实例内存结构

来源:互联网 发布:爱因斯坦 大学 知乎 编辑:程序博客网 时间:2024/06/04 19:51
---
可以通过oracle实例访问数据库。实例就是一组进程和内存结构:它存在于cpu上和服务器节点的内存中,但这种存在时暂时的,可以启动和停止实例。数据库的用户针对实例建立会话,由实例管理对数据库的所有访问。
实例由内存结构和进程组成,它暂时存在于RAM和CPU中。实例的生命周期就是其在内存中存在的时间。
构成实例的进程称为后台进程。
在操作系统提供的共享内存段实现的内存结构称为系统全局区(sga)SGA在实例启动时分配,在关闭时释放。
用户进程生成sql,服务器进程执行sql,服务器进程有时称为前台进程,与每个服务器进程相关的时一个非共享内存区,即程序全局区(PGA)。与系统全局区不同,此区是会话专用的。注意后台进程也拥有PGA。
任一会话的大小将根据任一时间的会话内存需要而异,dba可以定义所有PGA总量的上限,而oracle动态管理PGA对会话的分配情况。
dba只需指定SGA和PGA总体的内存分配,并让oracle按其认定的最佳方式管理内存。
oracle体系结构确保将逻辑结构从物理结构中抽象出来。
物理结构与逻辑结构之间的关联在数据字典中维护和记录,数据字典包含用来描述整个数据库的元数据。
数据字典是存储在数据库中的一组表。实例需要了解数据库的物理和逻辑结构,但描述这些的信息本身位于数据库中。

oracle实例由称为系统全局区(SGA)的共享内存块以及大量的后台进程构成。
SGA至少包含三种数据结构:数据库缓冲区缓存 日志缓冲区 共享池  还可能包含 大池 java池  流池
用户会话还需要服务器端的内存,此内存不共享,也称为程序全局区或PGA。每个会话都有自己专门的PGA。
----------------------------------------------------数据库缓存区缓存
1.数据库缓存区缓存是oracle用来执行sql的工作区域。
在更新数据时,用户的会话不直接更新磁盘上的数据。包含关键数据的数据块首先复制到数据库缓冲区。更改(如插入新行,删除或修改现有行)应用于数据库缓冲区缓存中这些数据块的副本。此后,块将在缓存中保留一段时间直至其占有的缓冲区需要缓存另一个块为至。
在查询数据时,数据也要经过缓存,会话计算出哪些块包含关键的行,并将他们复制到数据库缓冲区缓存(如果那里还未存在),此后,相关行传输到会话的PGA作进一步处理。与上面一样,此后块会在数据库缓冲区缓存中保留一段时间。
请注意术语“块”数据文件的格式被设置为固定大小的块,表行和其他数据对象(如索引键)存储在这些块中。数据库缓冲区缓存的格式被设置为内存缓冲区,每个可以容纳一个块。与块不同,行的长度是变化的,行的长度取决于为表定义的列的数量。根据块的大小和行的大小,每个块中可能有多个行,也可能有一个行延伸到多个块中。
理想状况下,包含频繁访问的数据的所有块将位于数据库缓冲区缓存中,从而最大程度地减少磁盘I/O的需要。
作为数据库缓冲区缓存的典型用法,假设在线商店的销售代表使用下列语句检索客户记录并执行更新。
select customer_id,customer_name from customers;
update custmoers set customer_name='sid' where customer=100;
commit;
为了执行用户进程提交的select 语句,会话服务器进程将扫描缓冲区缓存中包含相关行的数据块。如果找到了,就会发生一次缓冲区缓存命中。假设缓冲区缓存未命中,服务器进程在将结果发送给用户进程之前,会将包含相关行的数据从数据文件读入缓冲区。然后,用户进程将update和commit语句提交给服务器进程执行。在执行update语句时,如果包含行的块在缓存中仍然可用,那么在缓冲区缓存中将更新行。
如果缓冲区的缓存中存储的块的映像与磁盘上的映像不同,那么这样的缓冲区称为“脏缓冲区”
即使在写入磁盘后,此块也仍留在内存中,可能有一段时间,此缓冲区不会被另一个块所重写。
缓冲区的更新频率(或commit的数量)与何时写回数据文件没有任何关系。对数据文件执行写操作由数据库写入器后台进程完成。
数据库缓冲区缓存的大小对性能产生至关重要的影响,缓存应足够大。
数据库缓冲区缓存在实例启动时分配。
可以动态调整数据库缓冲区缓存的大小,也可以对其进行自动管理。

-------------------------------------------------日志缓冲区
日志缓冲区是小型的,用于短期存储将写入到磁盘上的重做日志的变更向量的临时区域。“变更向量”是应用于某些对象的修改,执行dml语句会生成应用数据的变更向量,有了重做日志,数据库就可以确保数据永不丢失:每当数据块发生更改时,就会将应用应用于块的变更向量写到重做日志,如果需要还原数据文件,则通过重做日志,可以将变更向量提取并应用于数据文件备份。
会话服务器进程不将重做记录直接写入重做日志文件,否则,每当执行dml语句时,会话将不得不等待磁盘I/O操作完成。相反,会话将重做记录写入内存中的日志缓冲区。这样做的速度将远比写入磁盘快。此后,日志缓冲区写出到重做日志文件。因此,日志缓冲区对磁盘的一次写入是来自多个事务的一批变更向量。即使如此,日志缓冲区中的变更向量也是接近实时地写入磁盘,当会话发出commit语句时,会实时执行日志缓冲区写操作。写操作由日志写入器后台进程完成。
日志缓冲区在启动实例时分配
在oracle体系结构中,将日志缓冲区转储到磁盘是基本瓶颈之一。dml的速度不能超过lgwr将变更向量转储到联机重做日志文件的速度。
日志缓冲区的大小固定不变,在启动实例时被设置为固定值。无法对其进行自动管理。
-----------------------------------------------共享池
(1)库缓存
库缓存是内存区域,按其已分析的格式存储最近执行的代码。通过将代码缓存在共享池,可以在不重新分析的情况下,极大地提高性能。
共享池的库缓存的目的是分析格式存储语句供执行,第一次发出语句时,必须在执行前进行分析,而到第二次,将可以立即执行。
select * from products where product_id=10;
在执行语句前,oracle服务器必须计算出它的含义以及执行方法。首先,什么是products?这是一个表,他是一个同义词,还是一个视图?它是否存在?再来看“*”,如果products是表,则此表包含那些列?用户有权查看此表吗?这些问题及其它任何问题的答案只有通过查询数据字典才能找到。
sql代码总是引用在数据字典中定义的对象。要针对表执行简单查询,oracle服务器必须首先查询数据字典,查看表是否存在,以及构成表的列,此后,必须找到表的物理位置。这要求读取段的区间映射。区间映射
列出构成表的所有区间,并详细指明每个区间所在的数据文件,区间从数据文件中的那个块开始,以及连续的块数。
(2)数据字典缓存
数据字典缓存有时称为“行缓存”它存储最近使用的对象定义:表索引用户和其他元数据定义的描述。通过将此类定义放在SGA的内存中,以便使所有会话可以直接访问它们,而不是被迫从磁盘上的数据字典重复读取他们,从而提高分析性能。
调整共享池的方法通常是使库缓存的大小合理化。这是因为,oracle使用的用于在sga中分配内存的算法是首先分配字典缓存,因此,如果库缓存正确无误,字典缓存必然是正确的。
(3)PL/SQL区
存储的PL/SQL对象是过程,函数,打包的过程,打包的函数,对象类型定义和触发器。他们全都像源代码那样存储在数据字典中,也使用已编译的格式。当会话调用存储的PL时/SQL对象时,它必须从数据字典读取,为了避免重复读取,将对象缓存到共享池的PL/SQL区
(4)sql查询和PL/SQL函数结果缓存
在很多应用程序中,同一个查询将由同一个会话或多个不同会话执行多次。通过创建结果缓存,oracle服务器可以将此类查询的结果存储在内存中,在下次发出查询时,服务器可以检索缓存的结果,而不是运行该查询
默认方式下,将禁用sql查询和pl/sql函数结果缓存,它赋予dba一定程度的控制能力,dba可以指定其最大容量。
共享池中的内存按照LRU(最近最少使用)算法来分配。
共享池在实例启动时分配。
共享池的大小是动态的,可以对其进行自动管理。

--------------------------大池

-------------------------java池

-------------------------流池


0 0