PCTFREE、PCTUSED、FREELIST的关系和应用

概念:

pctused:一个块的使用水位的百分比,这个水位将使该块返回到可用列表中去等待更多的插入操作。
  pctfree:用来为一个块保留的空间百分比,以防止在今后的更新操作中增加一列或多列值的长度。
  freelist:可用列表是表中的一组可插入数据的可用块。
  行连接:指一行存储在多个块中的情况,这是因为该行的长度超过了一个块的可用空间大小,即行链接是跨越多块的行。
  行迁移:指一个数据行不适合放入当前块而被重新定位到另一个块(那里有充足的空间)中,但在原始块中保留一个指针的情形。原始块中的指针是必需的,因为索引的ROWID项仍然指向原始位置。

计算公式:

PCTFREE=(Average Row Size-Initial Row Size)*100/Average Row Size
  PCTUSED=(100-PCTFREE) -Average Row Size * 100/Availabe Data Space

设置建议:

  1. 除非要严格地管理可用空间,否则不要设置pctused超过40或50。
  2. 一般这两个值地和不能达到90,否则会使Oarcle将更多地时间花费在处理空间利用上。下面是几个参考:
  3. pctfree 5,pctused 40 适合于静态表或只读表。
  4. pctfree 10,pctused 50 适合插入行后,更新活动不会增加已有行地长度地综合性OLTP系统。
  5. pctfree 20,pctused 40 适合于插入行后,更新活动会增加已有行地长度地OLTP系统。

使用情形:
    1、在ASSM为AUTO的模式下,Oracle根据dba_tables.avg_row_len来调整PCTUSED的大小,如下图所示
   2、在ASSM为MANUAL的模式下,oracle根据设置的pctused参数来调整pctused大小
   使用select * from dba_tables 可以查看表的pctused、pctfree参数的设置大小、以及avg_row_len的大小。


概念:    
   1、PCTFREE:块中保留用于UPDATE操作的空间百分比,当数据占用的空间达到此上限时,新的数据将不能再插入到此块中;    
    2、PCTUSED:指定块中数据使用空间的最低百分比;当一个块在达到PCTFREE,之后经历了一些DELETE操作,在其空间使用下降到PCTUSED后便可以重新被用于INSERT数据;这就是PCTFREE/PCTUSED参数的含义;

调整PCTFREE、PCTUSED参数的目标一方面是提高性能,另一方面则主要是提高空间使用效率,避免出现块中存在有许多未用的空间,但却无法找到一个块可以被用于插入新数据行的情况发生。

PCTFREE的使用

在Oracle中表的每一行数据由唯一的ROWID标记;而Oracle支持的数据类型中有一些长度是可变的,如VARCHAR,当对这些数据进行 UPDATE时,如果块中的可用空间不能容纳UPDATE后的数据行时,Oracle将会把此行移到其它数据块,同时保留此数据行的ROWID不变,并在 原有块中建一指针指向行迁移后的位置。在这种情况下读取一行数据将需要访问2个数据块,从而导致性能下降。PCTFREE保留的空间就是为确保更改后的数 据行可以仍存放于原有数据块中,避免行迁移的情况发生。 由此,如果PCTFREE设置不足时可能产生行迁移;而另一方面如果PCTFREE设置过高,将会造成空间浪费。因此正确设置PCTFREE需要对表中数 据的使用进行分析。对于数据长度不会变化或极少更新的情况,可以采用较小的PCTFREE;对于其它大多数情况应采用稍大的PCTFREE (PCTFREE的缺省值是10,如果不好估计需预留的空间,可以使用15-25的范围),不要为节约块中的空间而使用较小的PCTFREE值。

PCTUSED的使用

当块的使用的空间下降到PCTUSED后,此块被重新放回空闲链表(Freelist)中,作为后续Insert的候选块。同样,设置PCTUSED需要 视数据行的特性和Insert、Update、Delete的模式而定,但必须遵守的原则是:db_block_size * (100 - PCTFREE - PCTUSED)必须比行的长度大。 对于数据行长度变化较大的情况,应使用最大行长度来计算PCTUSED,并且应使用较低的PCTUSED值。因为在执行Insert时,如果数据块的可用 空间不能装下一行数据,当块的使用的空间是在PCTUSED之上,Oracle将把此块从Freelist中移走;当块的使用的空间是在PCTUSED之 下,Oracle将会扩展段空间。因此,PCTUSED如果设得过高,将导致段的不断扩展。 当数据行长度不大时,使用缺省的PCTUSED(40)是比较合适的;对于行长度较大的情况,最长的行有可能会占用半个以上的块空间,此时可设置 PCTUSED为10。较小的PCTUSED仅在表中的数据以随机方式被删除,而且仍有一些行长时间保留在块中时,才会造成空间使用上的问题,因为这些块 可能需要较长的时间才能或永远不能重新被用于存放新数据。在这种应用中,如果空间利用率一直处于较低水平,则需对PCTUSED进行分析和调整。

pctfree参数是控制freelist un-links的(即将块由freelists中移除)。设置pctfree=10 意味着每个块都保留10%的空间用作行扩展。pctused参数是控制freelist re-links的。设置pctused=40意味着只有在块的使用低于40%时才会回到表格的freelists中。
----------------

PCTFREE和PCTUSED的概念:PCTFREE存储参数告诉ORACLE什么时候应该将数据块从对象的空闲列表中移出。ORACLE的默认参数是 PCTFREE=10;也就是说,一旦一个INSERT操作使得数据块的90%被使用,这个数据块就从空闲列表(free list)中移出。 PCTUSED存储参数告诉ORACLE什么时候将以前满的数据块加到空闲列表中。当记录从数据表中删除时,数据库的数据块就有空间接受新的记录,但只有 当填充的空间降到PCTUSED值以下时,该数据块才被连接到空闲列表中,才可以往其中插入数据。PCTUSED的默认值是PCTUSED=40。 (1)PCTUSED较高意味着相对较满的数据块会被放置到空闲列表中,从而有效的重复使用数据块的空间,但会导致I/O消耗。PCTUSED低意味着在 一个数据块快空的时候才被放置到空闲列表中,数据块一次能接受很多的记录,因此可以减少I/O消耗,提高性能。 (2)PCTFREE的值较大意味着数据块没有被利用多少就从空闲列表中断开连接,不利于数据块的充分使用。PCTFREE过小的结果是,在更新时可能会 出现数据记录迁移(Migration)的情况。(注:数据记录迁移(Migration)是指记录在是UPDATE操作扩展了一个VARCHAR2类型 的列或BLOB列后,PCTFREE参数所指定的空间不够扩展,从而记录被ORACLE强制迁移到新的数据块,发生这种情况将较严重的影响ORACLE的 性能,出现更新缓慢)。
如何设定
       在建表或者索引时,指定存储参数,如
CREATE TABLE HR.WZHU
(
ID     NUMBER,
NAME   VARCHAR2(20 BYTE),
VALUE VARCHAR2(20 BYTE)
)
TABLESPACE USERS
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;

CREATE UNIQUE INDEX HR.ID_PRIMARY ON HR.WZHU
(ID)
LOGGING
TABLESPACE USERS
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
NOPARALLEL;

建立表/索引时的 存储参数:【PCTUSED参数与PCTFREE参数】相关推荐

  1. 数据库建立组合索引时应该遵循的规则, 精确查找先,范围查找后,尽管区分度高

    建组合索引的时候,区分度最高的在最左边. 正例:如果 where a=? and b=? ,a 列的几乎接近于唯一值,那么只需要单建 idx_a 索引即 可. 说明:存在非等号和等号混合判断条件时,在 ...

  2. mysql技术内幕innodb存储引擎——表索引算法和锁_(转)Mysql技术内幕InnoDB存储引擎-表索引算法和锁...

    表 原文:http://yingminxing.com/mysql%E6%8A%80%E6%9C%AF%E5%86%85%E5%B9%95innodb%E5%AD%98%E5%82%A8%E5%BC% ...

  3. 【clickhouse】ClickHouse表引擎 MergeTree 索引与数据存储方式 一级索引 二级索引

    1.概述 转载:ClickHouse表引擎 MergeTree 索引与数据存储方式 2.一级索引 MergeTree 主键使用 primary key 定义,定义主键后,会将数据依据 index_gr ...

  4. MySQL技术内幕InnoDB存储引擎(表索引算法和锁)

    表 4.1.innodb存储引擎表类型 innodb表类似oracle的IOT表(索引聚集表-indexorganized table),在innodb表中每张表都会有一个主键,如果在创建表时没有显示 ...

  5. 查看数据库、表、索引的物理存储情况

    在管理.维护数据库时,经常需要查看数据库文件.日志文件所占用的磁盘空间,以及磁盘还剩下的磁盘空间,你可以通过下面几种方面 查看数据库文件详细情况: 1: 是通过远程连接(或VPN)连接到数据库服务器, ...

  6. 12.1.2、Doris__基本使用、doris的基本命令、建表概念、语句、建表语法、建表方式(引擎存储规则)、导入数据的方式、支持的数据类型、rollup索引

    1.Doris使用(类似mysql的操作命令) 1)自带root用户 进入Doris集群:mysql -uroot -h node1 -P 9030 -p (回车输入密码) 创建用户(普通用户):cr ...

  7. 数据结构 实验14(1-2班):(深入理解索引存储结构)三元组存储的稀疏矩阵建立行列索引并求鞍点

    目录 前言: 需求分析: 难点分析: 代码和思路详解: 三元组表的头文件: 建立索引思路: 什么是三元组表的索引: 结合题意实现索引表: 建立索引表的代码实现: 索引表的结构体定义: 索引表的创建思路 ...

  8. mysql索引三个字段查询两个字段_mysql中关于关联索引的问题——对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引?...

    情况描述:在MySQL的user表中,对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引? 根据查询字段的位置不同来决定,如查询a,     a,b    a,b, ...

  9. mysql 关联索引_mysql中关于关联索引的问题——对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引?...

    情况描述:在MySQL的user表中,对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引? 根据查询字段的位置不同来决定,如查询a,     a,b    a,b, ...

最新文章

  1. Python: 没有switch-case语句
  2. ext4 文件系统的优化
  3. php正则匹配js中变量_PHP正则表达式核心技术 第4节 php查找匹配函数使用心得
  4. MapReduce的优化
  5. Python startswith() 方法
  6. python PIL 生成照片墙
  7. LINUX_egrep及扩展正则表达式
  8. [渝粤教育] 西南科技大学 机械专业外语 在线考试复习资料2021版
  9. JavaScript重难点解析6(Promise)
  10. 【JOURNAL】Greeting via Connexion on Air in Lufthansa并一些祝福
  11. 格兰因果模型可以分析哪些东西_计量 | 使用向量自回归模型(VAR)的操作要点,必备!...
  12. python学习笔记(52周存钱挑战)
  13. 【读书】2019年阅读记录
  14. 多元函数微分学之偏导数
  15. 基于unity3D的趣味桌球游戏开发
  16. U盘插入Mac电脑无反应什么原因?用NTFS for Mac解决简直人生开了挂!
  17. Kaggle(Gun Violence Data)—美国枪支暴力事件分析(1)
  18. 教你pdf转cad软件有哪些可以操作的!
  19. 如何下载通州区卫星地图高清版大图?
  20. SaaS做大客户的困境,困难重重,但不得不做

热门文章

  1. Context.PROVIDER_URL 逗号间隔
  2. NiftyNet开源平台使用
  3. 如何使用Ubuntu打电话
  4. iBATIS.NET
  5. Java相关面试题总结+答案(一)
  6. php 使用table方式导出excel文件
  7. Java----代码优化篇
  8. android中AndroidManifest.xml 的解析 (转)
  9. GNU make manual 翻译( 一百五十九)
  10. 在VC中 改变List列表中一行的颜色