【Freelist】关于Freelists和Freelist Groups的探究

简介: 1.有关Freelist的描述数据库读取的单位是数据块(block),一个block是否允许写入数据是基于一定的空闲度--PCTFREE和PCTUSED存储参数设置。Freelists就是一个指定了所有可以用于insert操作的数据块的列表。存在于这个列表中的数据块才能用于insert操作,一旦一个数据块无法用于insert(达到了PCTFREE参数指定的限度)则立刻从这个列表中摘除。Freelists的作用就在于管理高水位标志(HWM)以下的空闲空间,实际上一个segment可用的空闲空间包括两种类型:1)已经分配给这个segment但是从来未被使用过的位于高水位标志之上的bloc

1.有关Freelist的描述
数据库读取的单位是数据块(block),一个block是否允许写入数据是基于一定的空闲度--PCTFREE和PCTUSED存储参数设置。
Freelists就是一个指定了所有可以用于insert操作的数据块的列表。
存在于这个列表中的数据块才能用于insert操作,一旦一个数据块无法用于insert(达到了PCTFREE参数指定的限度)则立刻从这个列表中摘除。
Freelists的作用就在于管理高水位标志(HWM)以下的空闲空间,实际上一个segment可用的空闲空间包括两种类型:
1)已经分配给这个segment但是从来未被使用过的位于高水位标志之上的blocks。
2)位于高水位标志之下,被链接在Freelists上的blocks。

Oracle 9i中,在LMT(Locally Managed Tablespaces)中如果指定了ASSM(Automatic Segment Space Management),那么对于任何PCTUSED、Freelists、Freelist Groups存储参数的指定都将被忽略。

2.Freelists存储位置
存储在每个segment的header block中,可以通过如下SQL获取。
sec@secooler> create table t_manual (col1 number);
sys@secooler> select file_id,block_id from dba_extents where segment_name = 'T_MANUAL';

FILE_ID BLOCK_ID


     5          9

sys@secooler> alter system dump datafile 5 block 9;

使用Oracle提供的两个函数将块地址转化为可以供使用的文件号和块号
sys@secooler> select dbms_utility.data_block_address_file(29360138) from dual;
sys@secooler> select dbms_utility.data_block_address_block(29360138) from dual;

每次当一个block被加入到free list中时,该block会被放置在free list的链表头部。

设置Freelist Groups参数大于1就是设置了多个MFL(Master Free list),这样就缓解了对于MFL的争用。

3.有关Freelists和Freelist Groups的一个比喻
“想象有一台饮水机和源源不断的急需喝水的人们,一台饮水机就代表一个free list,而一个想喝水的人就是一个准备向segment中插入数据的会话。如果只有一个饮水机,那么所有想喝水的人都必须要排成一队,然后前一个喝完了下一个才能喝,这就产生了争用。设想一下现在放置10个饮水机,很明显手机靓号卖号平台人们可以排到10个队伍中的任何一个队伍里,毫无疑问,效率将大大提高。这里瓶颈又出现了,就是如果一个饮水机里的水被喝完了,就得给这个饮水机加水,此时如果只有一个加水员(这就是一个Freelist Group),那么加水的速度可能就会跟不上了,添加Freelist Group就是增加加水员,增加到2个,每个人负责5个饮水机(体现在参数上,是Freelists 5 Freelist Groups 2),那么效率又提升了。
对于空间浪费的负面影响,可以继续设想一下,来了一个十分能喝水的人,他守住一个饮水机不停地喝,喝完了,引水员就加水,又喝完了,又加,即使是其他的9个饮水机里都是满满的水也没用,因为这个人一旦从某个送水员管辖下的饮水机中开始喝水,就不会换到另外一个送水员管理的饮水机上去(一个会话一旦从某个Freelist Group的Freelist中开始读取空闲块,就不会再使用其他Freelist Group中的Freelist,即使其他的Freelist中还有很多的空闲块)。”

4.相关的等待事件及查询方法
1)涉及到的两个等待事件
(1)Buffer Busy Waits
(2)Enqueue

2)查询SQL语句
select /+rule/ s.username, e.owner, e.segment_name, s.p1 "File#", s.p2 "Block#"
from v$session s, v$session_wait w, dba_extents e
where w.event = 'buffer busy waits'
and s.sid = w.sid
and e.file_id = s.p1
and s.p2 between e.block_id and e.block_id + (e.blocks - 1);

5.小结
对Freelists和Freelist Groups概念的了解有助于理解空间争用问题。

Good luck.

secooler
10.10.08

-- The End --

目录
相关文章
|
存储 搜索推荐 数据库
深入解析向量数据库:定义、原理和应用的全面指南
深入解析向量数据库:定义、原理和应用的全面指南
3561 0
|
Python Windows
Python3+PyCharm环境的安装及配置
近期碰到有同学入门Python还不会安装并配置Python编程环境的,在这里做一期教程手把手教大家安装与配置使用(以 Python 3.9.9 以及 PyCharm 2021.3.1 为例)
1048 0
Python3+PyCharm环境的安装及配置
|
存储 数据库 数据库管理
SQLite中的B-Tree实现细节分析
SQLite在存储在外部的数据库是以B-Tree来组织的。
298 8
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【11月更文挑战第6天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
460 5
|
设计模式 XML 存储
【七】设计模式~~~结构型模式~~~桥接模式(Java)
文章详细介绍了桥接模式(Bridge Pattern),这是一种对象结构型模式,用于将抽象部分与实现部分分离,使它们可以独立地变化。通过实际的软件开发案例,如跨平台视频播放器的设计,文章阐述了桥接模式的动机、定义、结构、优点、缺点以及适用场景,并提供了完整的代码实现和测试结果。桥接模式适用于存在两个独立变化维度的系统,可以提高系统的可扩展性和灵活性。
【七】设计模式~~~结构型模式~~~桥接模式(Java)
|
人工智能
三战VS2019编译VTK7.1+Qt5.15.2
本文记录了作者在VS2019环境下编译VTK 7.1与Qt 5.15.2的历程,包括正确配置方法、遇到的编译错误以及解决过程。
299 5
|
存储 缓存 监控
Linux性能分析工具-perf并生成火焰图
Linux性能分析工具-perf并生成火焰图
|
存储 安全 C++
C++ 原子变量atomic variable
原子变量是 C++11 引入的一种同步机制,用于多线程环境中的无锁、线程安全操作。其操作不可分割,避免了数据竞争和不一致问题。原子变量位于 `<atomic>` 头文件中,支持多种类型如 `std::atomic<T>` 和特化类型。基本用法包括定义原子变量、加载、存储、交换及比较交换操作。内存顺序(如 `std::memory_order_seq_cst`)用于控制内存访问顺序和可见性,适用于不同场景。原子变量常用于线程安全的计数器和标志位等。
|
算法 安全 网络安全
HTTPS加密原理解析:保障通信安全的密码学算法
HTTPS加密原理解析:保障通信安全的密码学算法
1151 0
|
设计模式 自然语言处理 编译器
二十三种设计模式全面解析-解释器模式(Interpreter Pattern):用代码诠释语言的魅力
二十三种设计模式全面解析-解释器模式(Interpreter Pattern):用代码诠释语言的魅力
283 0