nkj827
作者nkj827·2020-04-30 21:40
项目经理·长春长信华天

数据缓存区应用

字数 3410阅读 591评论 0赞 3

高速缓冲区

数据缓存区(database buffer cache)中的缓冲区(buffer)通过两个列表管理:待写列表(write list)和最近最少使用列表(least recently used(LRU)

list)。待写列表中记录的是脏缓冲区(dirty buffer),即其中数据已被修改且尚未写入磁盘的缓冲区。最近最少使用列表中记录的是可用缓冲区(free buffer),锁

定缓冲区(pinned buffer),及还没被移入待写列表的脏缓冲区。可用缓冲区内的数据无需继续保留,可以用于存储新数据。而锁定缓冲区是正在被访问的缓冲区。

当某个 Oracle 进程访问一块缓冲区时,就会将其移动到 LRU 列表的最近使用(most recently used,MRU)端。随着更多被访问的缓冲区移动到 LRU 列表的 MRU

端,较早前被访问过的脏缓冲区就会逐渐向 LRU 列表的 LRU 端移动。

当 Oracle 的用户进程(user process)首次查询某块数据时,它将首先在数据缓存区内进行搜索。如果用户进程在数据缓存区内找到了所需的数据(称为缓存命

中(cache hit)),就可以直接从内存中访问数据。如果用户进程不能在数据缓存区中找到所需的数据(称为缓存失效(cache miss)),则需要从磁盘中的数据文件里

将相应的数据块复制到缓存中才能进行访问。缓存命中时的数据访问速度远远大于缓存失效时的速度。

用户进程将数据块读入数据缓存区之前首先要准备好可用缓冲区。用户进程从 LRU 列表的 LRU 端开始对其进行搜索。这个搜索过程将一直持续,直到找到可用缓

冲区或达到缓存搜索操作的预设限定值为止。

当用户进程在对 LRU 列表的搜索过程中遇到脏缓冲区时,它会先将此类缓冲区移入待写列表,之后再继续搜索。当用户进程找到了可用缓冲区时,就会将数据块

从磁盘写入缓冲区,并将此缓冲区移到 LRU 列表的 MRU 端。

如果 Oracle 用户进程对 LRU 列表的搜索操作达到了预设的限定值而仍旧没有找到可用缓冲区,那么进程将停止搜索并通知 DBW0 后台进程将部分脏缓冲区写入

磁盘。

当用户进程(user process)执行全表扫描(full table scan)时,它会将存储表数据的数据块读入缓冲区,并将这些缓冲区移动到 LRU 列表的 LRU 端(而不是 MRU

端)。这是因为全表扫描得到的数据通常只是暂时需要的,因此这些缓冲区应当被尽快地移出数据缓存区,为其他使用频率更高的数据块腾出空间。用户可以修改每个

表而设定全表扫描时缓冲区的使用方式,如:ALTER TABLE T CACHE;

show parameter db_cache_size

show parameter db_keep_cache_size

show parameter db_recycle_cache_size

NAME TYPE VALUE


db_cache_size big integer 88M

NAME TYPE VALUE


db_keep_cache_size big integer 0

NAME TYPE VALUE


db_recycle_cache_size big integer 0

以上分别是默认池、保持池和回收池的设定。

保持池中存放始终存放在内存中的数据块。

回收池中存放尽快从内存中退出不大可能重新被访问的重新被访问的数据块。

alter system set sga_max_size = 300M scopt=spfile;

应该现在最大设置与实际使用一致,直接分配保持池和回收池会出错(ORA-00384: 没有足够的内存来增加高速缓存的大小),所以须先增大 SGA 上限,并 startup force

alter system set db_keep_cache_size = 18m;

alter system set db_recycle_cache_size = 4m;

show parameter db_keep_cache_size

show parameter db_recycle_cache_size

NAME TYPE VALUE


db_keep_cache_size big integer 20M

NAME TYPE VALUE


db_recycle_cache_size big integer 8M

也可以看到本环境下 SGA 粒度是 4M,最小是 8M,不过要除了日志缓冲

alter table t storage (buffer_pool keep);

create table tt (x number) storage(buffer_pool recycle);

为对象设定高速缓冲目的池(默认当然是默认池,有点拗口,^_^)

show parameter db_block_size

show parameter db_%k_cache_size

第 36 页

NAME TYPE VALUE


db_block_size integer 8192

NAME TYPE VALUE


db_16k_cache_size big integer 0

db_2k_cache_size big integer 0

db_32k_cache_size big integer 0

db_4k_cache_size big integer 0

db_8k_cache_size big integer 0

非标准块缓冲池,创建非标准块的表空间时需先设置对应缓冲。非标准容量数据块使用的数据缓冲区中只有 DEFAULT 缓冲池。

select name,block_size,resize_state,current_size,target_size,prev_size from v$buffer_pool;

NAME BLOCK_SIZE RESIZE_STA CURRENT_SIZE TARGET_SIZE PREV_SIZE


KEEP 8192 STATIC 8 8 0

DEFAULT 8192 STATIC 156 156 164

RESIZE_STATE STATIC 启动没有改变过

ALLOCATING 正在被重新分配(用户可取消)

ACTIVATING 新的缓冲创建完成(用户不可取消)

SHRINKING 缓冲正在被删除(用户可取消)

CURRENT_SIZE 当前缓冲大小

TARGET_SIZE 当 RESIZE_STATE 值不为 STATIC 的,则为目标缓冲大小,否则与 CURRENT_SIZE 值相同

PREV_SIZE 前一个缓冲大小,当从来没有改变时值为 0

select name,size_for_estimate,size_factor,estd_physical_reads from v$db_cache_advice;

NAME SIZE_FOR_ESTIMATE SIZE_FACTOR ESTD_PHYSICAL_READS


DEFAULT 8 .0909 14576

DEFAULT 16 .1818 11569

DEFAULT 24 .2727 9706

DEFAULT 32 .3636 9020

DEFAULT 40 .4545 8873

DEFAULT 48 .5455 8775

DEFAULT 56 .6364 8546

DEFAULT 64 .7273 8546

DEFAULT 72 .8182 8546

DEFAULT 80 .9091 8546

DEFAULT 88 1 8546

NAME SIZE_FOR_ESTIMATE SIZE_FACTOR ESTD_PHYSICAL_READS


DEFAULT 96 1.0909 8546

DEFAULT 104 1.1818 8546

DEFAULT 112 1.2727 8546

DEFAULT 120 1.3636 8546

DEFAULT 128 1.4545 8546

DEFAULT 136 1.5455 8546

DEFAULT 144 1.6364 8546

DEFAULT 152 1.7273 8546

DEFAULT 160 1.8182 8546

已选择 20 行。

预估在不同的高速缓冲区的配置下,所需的物理读数

drop table tt purge;

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

3

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

X社区推广