数据库使用复杂的算法来管理表扫描。默认情况下,必须从磁盘读取缓冲区时,数据库会将缓冲区插入LRU列表的中间。通过这种方式,热块可以保留在高速缓存中,这样就不需要再次从磁盘读取它们。
全表扫描引起问题,该表扫描顺序读取表高水位线(HWM)下的所有行。假设表段中块的总大小大于缓冲区高速缓存的大小。对该表的完全扫描可以清除缓冲区高速缓存,从而防止数据库维护频繁访问的块的高速缓存。
全表扫描的默认模式
默认情况下,数据库采用保守的方法进行全表扫描,仅在表大小占缓冲区高速缓存的一小部分时才将小表加载到内存中。
要确定是否应缓存中型表,数据库使用的算法包含最后一次表扫描,缓冲区高速缓存的老化时间戳和缓冲区高速缓存中剩余空间之间的时间间隔。
对于非常大的表,数据库通常使用直接路径读取,它直接将块加载到PGA中并完全绕过SGA,以避免填充缓冲区高速缓存。对于中等大小的表,数据库可以使用直接读取或高速缓存读取。如果它决定使用高速缓存读取,则数据库将块放在LRU列表的末尾,以防止扫描有效地清除缓冲区高速缓存。
从Oracle Database 12c第1版(12.1.0.2)开始,数据库实例的缓冲区高速缓存会自动执行内部计算,以确定内存是否足以使数据库在实例SGA中完全缓存,以及在访问时缓存表是否足够对表现有益。如果整个数据库完全适合内存,并且满足各种其他内部条件,则Oracle数据库会将数据库中的所有表视为小表,并认为它们有资格进行缓存。但是,数据库不会缓存标有该NOCACHE
属性的LOB 。
并行查询执行
执行全表扫描时,数据库有时可以通过使用多个并行执行服务器来缩短响应时间。
在某些情况下,当数据库具有大量内存时,数据库可以在系统全局区域(SGA)中缓存并行查询数据,而不是使用直接路径读入程序全局区域(PGA)。通常,并行查询在低并发数据仓库中发生,因为潜在的资源使用。
CACHE属性
在不需要默认缓存行为的极少数情况下,您可以使用ALTER TABLE ... CACHE
更改将大表中的块读入数据库缓冲区缓存的方式。
对于具有CACHE
属性集的表,数据库不会强制或固定缓冲区高速缓存中的块。相反,数据库以与任何其他表块相同的方式将块从缓存中移除。在执行此选项时要小心,因为对大表的完全扫描可能会清除缓存中的大多数其他块。
alter TABLE c##fixf.fixf_svr_szhjymx CACHE;
alter table c##fixf.fixf_svr_szhjymx nocache;
保持属性
对于大型表,可以使用ALTER TABLE ... STORAGE BUFFER_POOL KEEP
以使扫描将这些表的块加载到保留池中。
将表放入保留池会更改缓冲区缓存中存储块的部分。数据库不是在默认缓冲池中缓存块,而是将它们缓存在保持缓冲池中。没有单独的算法控制来保持池缓存。
(1)创建一个表,在访问数据时保存到keep池中:
Create table state_list (state_abbrev varchar2(2),state_desc varchar2(25) )
storage (buffer_pool keep) ;
(2)将该表改存到recycle池中:
Alter table state_list storage (buffer_pool recycle) ;
(3)将表重新改存到keep池中:
Alter table state_list storage (buffer_pool keep) ;
(4)查看keep池中的磁盘和内存读取情况:
selectphysical_reads "Disk Reads " ,
db_block gets + consistent gets "Memory Reads"
fromv$buffer_pool_statistics
wherename = 'KEEP';
强制完全数据库缓存模式
要在某些情况下提高性能,可以显式执行该ALTER DATABASE ... FORCE FULL DATABASE CACHING
语句以启用强制完全数据库缓存模式。
与默认模式(自动)相反,强制完全数据库缓存模式将整个数据库(包括NOCACHE
LOB)视为有资格在数据库缓冲区缓存中进行缓存。从Oracle Database 12c第1版(12.1.0.2)开始提供此模式。
注意:
启用动力最大数据库高速缓存模式并没有强制数据库到内存中。相反,整个数据库有资格缓存在缓冲区缓存中。Oracle数据库仅在访问表时才缓存表。
Oracle建议仅在每个实例的缓冲区高速缓存大小大于数据库大小时启用强制完全数据库高速缓存模式。本指南适用于单实例和Oracle RAC数据库。但是,当Oracle RAC应用程序分区良好时,如果所有实例的组合缓冲区高速缓存(用于处理实例之间的重复高速缓存块的额外空间)大于数据库大小,则可以启用强制完全数据库高速缓存模式。