物理存储结构主要是指: extent的分配, 以及datablock 存储相关, 置于tablespace, segment 都是逻辑结构.

  • tablespace : 逻辑结构, 没有实际物理存储.
  • segment : 逻辑结构, 比如一个表, 索引等 object, 每次按照extent分配.
  • extent : 物理结构,  物理上连续的 data block, 是一次分配的最小单位, extent 与 extent 之间可以是不连续的, 但是extent 内部的data block 是连续的. extent可以来自于表空间中不同的数据文件, 所以 segment 才可以横跨多个datafile, 但是一个extent内部的data block 是只能属于某一个datafile的.
  • datablock, 物理结构, 对应操作系统的物理文件块.

extent

extent 分配存储的优先级

segment 大于 tablespace 大于 oracle default. (这里指的是 怎么分配 extent)

一般创建表空间时会指定extent分配原则:

create tablespace USER_LEON
datafile '/opt/oracle/oradata/leon/leon01.dbf' size 10M
extent management LOCAL uniform size 128k
segment space management auto;

extent management 就是指 extent的分配和管理办法: (参考以上代码)

现在都是使用 LOCAL 管理办法, 在LOCAL 管理办法中又分为: 自动分配(autoallocate) 和 统一分配(uniform)

extent management local autoallocate: 人为管理比较少, 小表适合

extent management local uniform size 128k: 每次分配extent都是128k, 人为管理多, 碎片化小

datablock

这里主要对应上边代码 segment space management auto; 这句, 这表示自动管理表空间 datablock.

推荐使用自动管理表空间

这里主要说一下, datablock 的内部结构:

  • block header: the data block address, table directory, row directory, and transaction slots that are used when transactions make changes to rows in the block. (从上到下)
  • data space: row data is inserted into the block from bottom up. (从下到上)
  • Free space: the free space in a block is in the middle of the block thus both the header and the row data space can grow when necessary, the free space in a block is coninguous initally, however, deletions and updates may fragment the free space in the block, the free space in the block is coalesced by teh oracle when nessary.

参数

initrans, maxtrans: specify the initial and the maximum number of transaction slots(事务槽)that are created in an index or a data block, the transaction slots are used to store information about transactions that are making changes to the block at a point in time. 可以控制并发.

事务要修改块中的数据, 必须获得该块中的一个 itl (事务槽), 通过 itl 和 undo segment header 中的 transaction table, 可以知道事务处于活动阶段, 还是已经完成. 事务在修改块时(起始就是在修改行) 会检查行中 row header 中的标志位, 如果该标志位为 0 (该行没有被活跃的事务锁住, 这是可能要进行 deferred block clenaout 等工作), 就把该标志修改为事务在该块获得的 itl 序号, 这样当前事务就获得了对记录的锁定, 然后就可以修改数据了, 这也就是 oracle 行锁实现的原理.

ITL 也叫事务槽, 它位于 block header.

一个事务可能涉及多个BLOCK的更改, 所以一个事务可能在多个block 中产生 ITL 信息.

PCTFREE for a data segment specifies the percentage of space in each data block reserved for growth resulting from updates to rows in the block .最少有多少空闲空间,为了已存在数据的扩张,比如 update 当前已存在的数据。比如 10%

为什么要留出空间来呢? 这个留出空间的意思是,当这个 datablock 存储到一定程度的时候,剩下的空间是不能再继续往里存储数据的,这是为什么呢?

因为需要留下这些空间为了 已经存储在这个 data block 里的数据被修改使用的,比如这个 data block里的数据被修改了,尤其是增大了,那么需要把相关内容

存储在这个data block中,所以要预留一些空间.

PCTUSED for a data segment represents the minimum percentage of used space that the Oracle server tries to maintain for each data block of the table. 默认 40%

A block is put back on the free list when its used space falls below PCTUSED. The free list of a segment is a list of blocks that are candidates for accommodating future inserts. A segment, by default, is created with one free list, Segments can be created with a higher number of free lists by setting the FREELISTS parameter of the storage clause. The default for PCTUSED is 40%.

Both PCTFREE and PCTUSED are calclated as percentages of available data space, that is, the block space that remains after deducting the header space from the total block size.

下边的链表叫空闲链表,首先pctused这个概念必须是删除数据时相关,即当一个新块,你往里边插数据,没关系,你可以插入到该块的90%都没有问题,但是当你删除该块的数据,就必须要删除的40%已下之后,这个块才会被放置到空闲链表上,你才可以继续向该块插入数据(从空闲链表上找到该数据块)

作用是 : 比如要插入数据到 datablock 中, extent内部 有个链表 free list,链表上的节点就是个个 data block ( 那些存储的数据小于 PCTUSED 的 datablock) 即当新插入数据时, oracle 会自动找那些存储空间多的地方插入,判断的依据就是 PCTUSED )

PCTFREE , PCTUSED 单位都是 %

PCTUSED 参数用于决定一个数据快(data block) 是否可被用于插入新数据(放置在空闲链表中),她的依据是数据区(rowdata)与数据块头(overhead))的容量之和占数据块全部容量的最大百分比

当一个数据块中的可用空间比例小于 PCTUSED 参数的规定时,ORACLE就认为此数据块无法被用于插入新数据,直到数据块中的占用容量比例小于PCTUSED参数的限定

举例说明

假设你一个块可以存放100个数据,而且PCTFREE 是10,PCTUSED是40,则:不断的向块中插入数据,如果当存放到90个时,就不能存放新的数据,这是受pctfree来控制,预留的空间是给UPDATE用的。注意, 这时, 这个块会被从 freelist 空闲表中拿出来, 所以不能再插入数据了.

当你删除一个数据后,再想插入个新数据行不行?不行,因为这个块还没有别拿到freelist上, 必须是删除41个,即低于40个以后才能插入新的数据的,这是受pctused来控制的。

注意:如果表空间上启用了ASSM,在建立表的时候,只能指定PCTFREE,否则可用指定PCTFREE和PCTUSED。

如果使用自动管理表空间, 不需要设置pctused.

置于 pctfree, 要看这个表被修改的多不多, 如果需要频繁被修改, 则可能需要多余 10% 的 pctfree.

专题实验 Storage structure 物理存储的更多相关文章

  1. 14.2.5.7 Physical Row Structure 物理数据结构:

    14.2.5.7 Physical Row Structure 物理数据结构: InnoDB物理记录结构依赖行格式 在表创建的时候, 默认, InnoDB 使用Antelope 文件存储格式和它的压缩 ...

  2. InnoDB的表类型,逻辑存储结构,物理存储结构

    表类型 对比Oracle支持的各种表类型,InnoDB存储引擎表更像是Oracle中的索引组织表(index organized table).在InnoDB存储引擎表中,每张表都有个主键,如果在创建 ...

  3. MongoDB【第二篇】MongoDB逻辑与物理存储结构

    基本的操作 一.常用的命令和基础知识 1.进入MongoDB sehll 首先我们进入到MongoDB所在目录执行 cd /work/app/mongodb/bin/ #启动 ./mongo 为了方便 ...

  4. yaffs2物理存储

    了解一个文件系统,除了了解运行机制(RAM结构)外,还需了解文件系统怎样物理存储的.RAM数据结构是为文件系统更好运行,而物理存储是文件系统载体.文件系统出问题后,最终要从物理存储寻找数据.参考&qu ...

  5. Innodb物理存储结构系列1

    本篇先介绍 下Innodb表空间,文件相关的内存数据结构. 1. 数据结构 Innodb的tablespace和文件的关系,是一对多的关系,先来看三个结构体 1. fil_system_struct: ...

  6. Hierarchical Storage structure

    1.hierarchical storage structure      This notion of inserting a smaller, faster storage device (e.g ...

  7. 与众不同 windows phone (6) - Isolated Storage(独立存储)

    原文:与众不同 windows phone (6) - Isolated Storage(独立存储) [索引页][源码下载] 与众不同 windows phone (6) - Isolated Sto ...

  8. 算法与数据结构(四) 图的物理存储结构与深搜、广搜(Swift版)

    开门见山,本篇博客就介绍图相关的东西.图其实就是树结构的升级版.上篇博客我们聊了树的一种,在后边的博客中我们还会介绍其他类型的树,比如红黑树,B树等等,以及这些树结构的应用.本篇博客我们就讲图的存储结 ...

  9. DBMS_ROWID定位数据行物理存储位置

    对于Oracle中的堆表,我们可以通过oracle内置的ROWID伪列得到对应行记录所在的ROWID的值(注意,这个ROWID只是一个伪列,实际的块中并不存在该列).然后我们可以通过DBMS_ROWI ...

随机推荐

  1. python学习笔记——多进程一 基础概念

    1 进程 进程:程序的一次(从开始到结束)执行过程,属于一个动态过程.是系统进行资源分配和调度的基本单位. 程序:指的是一个文件,磁盘中可执行的代码.属于一个静态文件 注:进程运行时需要把程序加载如内 ...

  2. go学习笔记(3) -- package fmt

    package fmt fmt包实现了格式化的I/O函数,这点类似C语言中的printf和scanf,但是更加简单,其中的格式“占位符”衍生自 C 占位符 一般占位符 布尔占位符 浮点数及其复合构成占 ...

  3. Spark与Pandas中DataFrame对比

      Pandas Spark 工作方式 单机single machine tool,没有并行机制parallelism不支持Hadoop,处理大量数据有瓶颈 分布式并行计算框架,内建并行机制paral ...

  4. Linux-Ubuntu操作记录

    ubuntu 基本命令 1.帮助man      --help简单的帮助  如:man tar 或者tar --help      help command 较详细的帮助      man comma ...

  5. mysql 批量更新常用操作

    mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field = ' ...

  6. CSS2中的伪类与伪元素

    CSS 伪类用于向某些选择器添加特殊的效果. 我们最常见的就是有超链接的时候,向下面这样 a:link {color: #FF0000} /* 未访问的链接 */ a:visited {color: ...

  7. ui-router路由控制器(一)

    angularUI 在不断发展过程中已经被划分成了几个模块,你可以选择你需要的模块载入,我们今天要了解一下路由控制器 ui-router ,它就是angularUI划分出出来的一个独立模块. 此模块只 ...

  8. excel错误:外部表不是预期的格式 错误

    环境:win7+iis7+Office2007 在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一 ...

  9. Memcached安装使用和源代码调试

    memcached官网:http://memcached.org/ 一.安装 下载 # wget http://www.memcached.org/files/memcached-1.4.25.tar ...

  10. Ruby的DevKit名词解释

    为了加快运行速度,Ruby下好多扩展包都是用C语言写的二进制包,如果我们要安装就要重新编译,DevKit包主要就是将编译用的工具链打包,解决了众多依赖问题,方便了群众. 但是,在实际安装中,可能还会遇 ...