关于Freelists和Freelist Groups的研究(修订版)- 什么是freelists

本文深入探讨Oracle数据库中Freelists和Freelist Groups的作用、存取机制、争用诊断和优化方法。介绍了数据块基于pctfree和pctused参数决定是否可用于insert操作,以及delete操作后数据块重新加入freelists的条件,还提及freelists管理高水位标志以下空闲空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.             什么是 freelists
本文在于探讨Freelists和Freelist Groups的作用,存取机制,争用诊断和优化方法,同时通过理论和测试来推翻一些存在了很久的错误观点。本文的读者应该具有较深入的Oracle知识,对于一般的开发人员这篇文章可能并没有太多的帮助。
我们知道Oracle数据库的读取单位是数据块(Block),而一个Block是否允许被写入数据是基于一定的空闲度,这就是大家知道的pctfree和pctused存储参数设置。
假设pctfree=10, pctused=40,这就表明当一个Block的空间使用率达到了90%(100-pctfree)时,这个block就不再允许被用于新增数据(insert),而保留下来的这10%的空间则被预留为行更新(update)所可能需要的空间扩展,我们说此时这个block就从freelist上被摘走了(实际上还有另外一种情况,就是当块剩余空间不足以插入一条记录并且该块的使用率已经超过了pctused定义的值并且该块位于freelist header处时,该块也会从freelist上被摘走,术语称为UNLINK)。当有数据删除(delete)的时候,只有该block中的数据被删除到一定的程度,该块才会重新被加入到freelists中,而这个程度就是pctused参数定义的数值,如我们这个例子中,只有块中的数据降低到40%以下的时候,该块才被重新允许用于新增数据。
通过上面的描述,可以知道所谓freelists,就是一个指定了所有可以用于insert操作的数据块的列表。存在在这个列表中的数据块才能用于insert操作,一旦一个数据块无法用于insert(达到了pctfree参数指定的限度)则立刻从这个列表中被摘除。freelists的作用就在于管理高水位标志(HWM)以下的空闲空间。
注意:freelists只是管理高水位标志以下的空闲空间,而实际上一个segment可用的空闲空间包括两种类型:
1.  已经分配给这个segment但是从来未被使用过的位于高水位标志之上的blocks
2.  位于高水位标志之下,被链接在freelists上的blocks
 
至于freelist groups的概念和作用,在下面的章节适当的地方会解释。
-- LMIS.RK_YJMINFO_PRODUCTLINE definition CREATE TABLE "LMIS"."RK_YJMINFO_PRODUCTLINE" ( "BARCODE" VARCHAR2(255) NOT NULL ENABLE, "PIC_NO_TOUF" VARCHAR2(11), "TOUFK_NO" VARCHAR2(10) NOT NULL ENABLE, "TOUF_TIME" DATE, "FENBZC_TIME" DATE, "FENB_TIME" DATE, "MAP_TIME" DATE, "TOUF_STATE" VARCHAR2(2), "FENBZC_STATE" VARCHAR2(2), "FENB_STATE" VARCHAR2(2), "MAP_STATE" VARCHAR2(2), "ZCSSX_NO" VARCHAR2(10), "FBSSX_NO" VARCHAR2(10), "MPLOC_NO" VARCHAR2(10), "TUOP_BARCODE" VARCHAR2(10), "SHANGP_ID" VARCHAR2(50), "LOT" VARCHAR2(20), "MAP_XL" NUMBER(10,0), "YEWDJ_NO" VARCHAR2(50), "HUOW_ID" VARCHAR2(50), CONSTRAINT "PK" PRIMARY KEY ("BARCODE", "TOUF_TIME") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "LMIS" ENABLE, SUPPLEMENTAL LOG DATA (ALL) COLUMNS ) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "LMIS" ; CREATE UNIQUE INDEX "LMIS"."PK" ON "LMIS"."RK_YJMINFO_PRODUCTLINE" ("BARCODE", "TOUF_TIME") PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "LMIS" ; 根据这个DDL生成Java POJO
最新发布
03-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值