`
wsql
  • 浏览: 11715324 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

oracle数据块详解

 
阅读更多

数据库的逻辑结构包括:数据块,区,段,表空间。

oracle数据块是oracle数据库存储基础,有磁盘空间的若干字节组成,数据块是oracle数据库的最小逻辑单元,可以定义数据块为2k4k8k16k32k甚至更大,默认oracle块大小是8k,通常我们称为oracle块。当然正常情况下oracle块应该是os块的整数倍,当然具有标准大小的块叫做标准块,和标准块不同的块叫做非标准块。同一个数据库中,当然指的是9i以后,支持同一个数据中同时使用标准块和非标准块。

Oracle块大小设置在初始化参数文件里面(init.ora)中的db_block_size中设置,块是处理updateinsertselect数据事务的最小单位,当用户从表中选择数据时,将在oracle块上读取或是提取数据。意思就是说:os每次执行i/o时候,是以os的块为单位;oracle每次执行i/o时候,是以oracle块为单位。

总结为一下几点:

最小的 I/O单元

包含一个或多个 OS

DB_BLOCK_SIZE

数据库创建时设置,数据库创建后不能更改

Oracle数据块的大小设置意见:

1、 如果行较小且访问随机,则选择小的块尺寸

2、 如果行小且访问连续的,或者有较大的行,则选择较大尺寸的块。

就是说看我们的业务系统。

数据块结构

1、基本组成

块结构说明如下:

块头:存放一些基本信息,如物理位置,块所属的段类型(数据段、索引段、回滚段等)

表目录:如果块中存储的数据为表数据,则表目录中保存这个表的相关信息

行目录:如果块中存储的数据为表数据,则行目录中保存数据行的相关信息。

块头、表目录和行目录组成块的头部信息(overhead),这部分不存数据库中实际的数据,而是用来记录该块的逻辑结构,而且这部分占用的空间不是固定的,大约在84-107字节之间。

行记录:真正存放数据的区域,这部分空间已被使用。

空闲空间:未使用的区域,用于新行的插入或者已经存在行的更新。(这里有个概念行迁移:就是当update操作时,块中空闲的空间不够保存修改的数据,那么记录就将保存到另一个拥有足够空间的块中,而只在原块上保留一条指向新块的rowid,这就是行迁移row migration

2、自由空间

空闲空间的使用

Insert这时候块的自由空间会减少,

update的时候块的自由空间也会减少

当使用DELETE语句删除块中的记录或者使用UPDATE语句把列的值更改成一个更小值的时候,Oracle会释放出一部分自由空间。释放出的自由空间并不一定是连续的,常情况下,Oracle不会对块中不连续的自由空间进行合并。因为合并数据块中不连续的自由空间会影响数据库的性能。只有当用户进行数据插入(INSERT)或者更新(UPDATE)操作,却找不到连续的自由空间的时候,Oracle才会合并数据块中不连续的自由空间。

3、空闲空间的管理

对于块中的自由空间,Oracle提供两种管理方式:自动管理,手动管理

行链接和行迁移(Row Chaining and Migrating

行链接(Row Chaining):如果我们往数据库中插入(INSERT)一行数据,这行数据很大,以至于一个数据块存不下一整行,Oracle就会把一行数据分作几段存在几个数据块中,这个过程叫行链接(Row Chaining)。

如果一行数据是普通行,这行数据能够存放在一个数据块中;如果一行数据是链接行,这行数据存放在多个数据块中。

行迁移(Row Migrating):数据块中存在一条记录,用户执行UPDATE更新这条记录,这个UPDATE操作使这条记录变长,这时候,Oracle在这个数据块中进行查找,但是找不到能够容纳下这条记录的空间,无奈之下,Oracle只能把整行数据移到一个新的数据块。原来的数据块中保留一个“指针”,这个“指针”指向新的数据块。被移动的这条记录的ROWID保持不变。行迁移的原理如下图所示:

无论是行链接还是行迁移,都会影响数据库的性能。Oracle在读取这样的记录的时候,Oracle会扫描多个数据块,执行更多的I/O。而且是成倍加大i/o

1Oracle使用位图(bitmap)来管理和跟踪数据块,这种块的空间管理方式叫“自动管理”。自动管理有下面的好处:

◆易于使用

◆更好地利用空间

◆可以对空间进行实时调整

2)块中自由空间的手动管理(手动管理比较复杂)

用户可以通过PCTFREE, PCTUSED来调整块中空间的使用,这种管理方式叫手动管理。相对于自动管理,手动管理方式比较麻烦,不容易掌握,容易造成块中空间的浪费。

PCTFREE参数用于指定块中必须保留的最小空闲空间百分例。之所以要预留这样的空间,是因为UPDATE时,需要这些空间。如果UPDATE时,没有空余空间,Oracle就会分配一个新的块,这会产生行迁移(Row Migrating)。

PCTUSED也是用于设置一个百分比,当块中已使用的空间的比例小于这个百分比的时候,这个块才被标识为有效状态。只有有效的块才被允许插入数据。

三、基本实验

1)下面我们先来分析一下块。

下面我们来看看这个数据块

dump说明
创建表空间和测试表:
create tablespace testblock datafile '/opt/app/oracle/oradata/wolf/testblock01.dbf' size 100M;
create table testblock(
id number,
name varchar(4)
) tablespace testblock;
插入3条数据然后提交:
SQL> insert into testblock values(1,'a');
SQL> insert into testblock values(2,'b');
SQL> insert into testblock values(3,'c');
SQL> commit;
SQL> select * from testblock;
ID NAME
---------- --------
1 a
2 b
3 c

SQL> commit

SQL> desc V$datafile;

Name Null? Type

----------------------------------------- -------- ----------------------------

FILE# NUMBER

CREATION_CHANGE# NUMBER

CREATION_TIME DATE

TS# NUMBER

RFILE# NUMBER

STATUS VARCHAR2(7)

ENABLED VARCHAR2(10)

CHECKPOINT_CHANGE# NUMBER

CHECKPOINT_TIME DATE

UNRECOVERABLE_CHANGE# NUMBER

UNRECOVERABLE_TIME DATE

LAST_CHANGE# NUMBER

LAST_TIME DATE

OFFLINE_CHANGE# NUMBER

ONLINE_CHANGE# NUMBER

ONLINE_TIME DATE

BYTES NUMBER

BLOCKS NUMBER

CREATE_BYTES NUMBER

BLOCK_SIZE NUMBER

NAME VARCHAR2(513)

PLUGGED_IN NUMBER

BLOCK1_OFFSET NUMBER

AUX_NAME VARCHAR2(513)

FIRST_NONLOGGED_SCN NUMBER

FIRST_NONLOGGED_TIME DATE

SQL> select FILE#,name from v$datafile;

FILE#

----------

NAME

--------------------------------------------------------------------------------

1

/opt/app/oracle/oradata/wolf/system01.dbf

2

/opt/app/oracle/oradata/wolf/undotbs01.dbf

3

/opt/app/oracle/oradata/wolf/sysaux01.dbf

FILE#

----------

NAME

--------------------------------------------------------------------------------

4

/opt/app/oracle/oradata/wolf/users01.dbf

5

/opt/app/oracle/oradata/wolf/testblock01.dbf

SQL> select rowid,dbms_rowid.rowid_relative_fno(rowid) rel_fno,dbms_rowid.rowid_block_number(rowid)

blockno from testblock;

2

ROWID REL_FNO BLOCKNO

------------------ ---------- ----------

AAAMixAAFAAAAAMAAA 5 12

AAAMixAAFAAAAAMAAB 5 12

AAAMixAAFAAAAAMAAC 5 12

SQL> alter system dump datafile 5 block 12;

SQL> show parameter dump;

查找dumping文件位置

[root@test ~]# cd /opt/app/oracle/admin/wolf

[root@test wolf]# ls

adump bdump cdump dpdump pfile udump

[root@test wolf]# cd udump/

[root@test udump]# ls

wolf_ora_18566.trc wolf_ora_19120.trc wolf_ora_4952.trc wolf_ora_5792.trc

wolf_ora_18605.trc wolf_ora_19790.trc wolf_ora_4954.trc wolf_ora_5826.trc

wolf_ora_18608.trc wolf_ora_19818.trc wolf_ora_5721.trc wolf_ora_5833.trc

wolf_ora_19087.trc wolf_ora_19820.trc wolf_ora_5764.trc wolf_ora_5860.trc

wolf_ora_19114.trc wolf_ora_4899.trc wolf_ora_5766.trc wolf_ora_9291.trc

[root@test udump]# ls -l

total 272

-rw-r----- 1 oracle oinstall 593 Jul 8 05:56 wolf_ora_18566.trc

-rw-r----- 1 oracle oinstall 650 Jul 8 05:56 wolf_ora_18605.trc

-rw-r----- 1 oracle oinstall 1872 Jul 8 06:05 wolf_ora_18608.trc

-rw-r----- 1 oracle oinstall 593 Jul 8 04:05 wolf_ora_19087.trc

-rw-r----- 1 oracle oinstall 650 Jul 8 04:05 wolf_ora_19114.trc

-rw-r----- 1 oracle oinstall 196171 Jul 8 04:21 wolf_ora_19120.trc

-rw-r----- 1 oracle oinstall 593 Jul 8 06:29 wolf_ora_19790.trc

-rw-r----- 1 oracle oinstall 650 Jul 8 06:29 wolf_ora_19818.trc

-rw-r----- 1 oracle oinstall 3331 Jul 8 11:08 wolf_ora_19820.trc

-rw-r----- 1 oracle oinstall 619 Jul 14 05:25 wolf_ora_4899.trc

-rw-r----- 1 oracle oinstall 648 Jul 14 05:25 wolf_ora_4952.trc

-rw-r----- 1 oracle oinstall 2717 Jul 14 05:36 wolf_ora_4954.trc

-rw-r----- 1 oracle oinstall 591 Jul 7 10:02 wolf_ora_5721.trc

-rw-r----- 1 oracle oinstall 907 Jul 7 10:03 wolf_ora_5764.trc

-rw-r----- 1 oracle oinstall 591 Jul 7 10:03 wolf_ora_5766.trc

-rw-r----- 1 oracle oinstall 2630 Jul 7 10:03 wolf_ora_5792.trc

-rw-r----- 1 oracle oinstall 776 Jul 7 10:03 wolf_ora_5826.trc

-rw-r----- 1 oracle oinstall 591 Jul 7 10:03 wolf_ora_5833.trc

-rw-r----- 1 oracle oinstall 648 Jul 7 10:04 wolf_ora_5860.trc

-rw-r----- 1 oracle oinstall 2045 Jul 8 04:04 wolf_ora_9291.trc

[root@test udump]# date

Sat Jul 14 05:38:57 EDT 2012

[root@test udump]# cat wolf_ora_4954.trc | more

/opt/app/oracle/admin/wolf/udump/wolf_ora_4954.trc

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

ORACLE_HOME = /opt/app/oracle/product/10g

System name: Linux

Node name: test

Release: 2.6.18-128.el5

Version: #1 SMP Wed Dec 17 11:42:39 EST 2008

Machine: i686

Instance name: wolf

Redo thread mounted by this instance: 1

Oracle process number: 15

Unix process pid: 4954, image: oracle@test (TNS V1-V3)

*** 2012-07-14 05:36:52.410

*** SERVICE NAME:(SYS$USERS) 2012-07-14 05:36:52.410

*** SESSION ID:(159.3) 2012-07-14 05:36:52.410

Start dump data blocks tsn: 6 file#: 5 minblk 12 maxblk 12

buffer tsn: 6 rdba: 0x0140000c (5/12)

scn: 0x0000.0007e543 seq: 0x05 flg: 0x02 tail: 0xe5430605

frmt: 0x02 chkval: 0x0000 type: 0x06=trans data

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x0CEF4200 to 0x0CEF6200

CEF4200 0000A206 0140000C 0007E543 02050000 [......@.C.......]

CEF4210 00000000 00000001 0000C8B1 0007E52C [............,...]

CEF4220 00000000 00320002 01400009 00230007 [......2...@...#.]

CEF4230 000000DD 0080077F 003400CC 00002003 [..........4.. ..]

CEF4240 0007E543 00000000 00000000 00000000 [C...............]

CEF4250 00000000 00000000 00000000 00000000 [................]

CEF4260 00000000 00030100 0018FFFF 1F651F80 [..............e.]

CEF4270 00001F65 1F900003 1F801F88 00000000 [e...............]

CEF4280 00000000 00000000 00000000 00000000 [................]

Repeat 501 times

CEF61E0 00000000 0202012C 630104C1 0202012C [....,......c,...]

CEF61F0 620103C1 0202012C 610102C1 E5430605 [...b,......a..C.]

Block header dump:0x0140000c

Object id on Block? Y

seg/obj: 0xc8b1 csc: 0x00.7e52c itc: 2 flg: E typ: 1 - DATA

brn: 0 bdba: 0x1400009 ver: 0x01 opc: 0

inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc

0x01 0x0007.023.000000dd 0x0080077f.00cc.34 --U- 3 fsc 0x0000.0007e543

0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000

data_block_dump,data header at 0xcef4264

===============

tsiz: 0x1f98

hsiz: 0x18

pbl: 0x0cef4264

bdba: 0x0140000c

76543210

flag=--------

ntab=1

nrow=3

frre=-1

fsbo=0x18

fseo=0x1f80

avsp=0x1f65

tosp=0x1f65

0xe:pti[0] nrow=3 offs=0

0x12:pri[0] offs=0x1f90

0x14:pri[1] offs=0x1f88

0x16:pri[2] offs=0x1f80

block_row_dump:

tab 0, row 0, @0x1f90

tl: 8 fb: --H-FL-- lb: 0x1 cc: 2

col 0: [ 2] c1 02

col 1: [ 1] 61

tab 0, row 1, @0x1f88

tl: 8 fb: --H-FL-- lb: 0x1 cc: 2

col 0: [ 2] c1 03

col 1: [ 1] 62

tab 0, row 2, @0x1f80

tl: 8 fb: --H-FL-- lb: 0x1 cc: 2

col 0: [ 2] c1 04

col 1: [ 1] 63

end_of_block_dump

End dump data blocks tsn: 6 file#: 5 minblk 12 maxblk 12

一些参数需要自己去了解

欢迎加入:
119224876(db china联盟),233065499(db china联盟),229845401(虚拟化-云计算-物联网)

分享到:
评论

相关推荐

    oracle数据块解析

    oracle数据块解析

    Oracle数据块结构分析说明BLOCK结构详解

    Oracle数据块结构分析说明BLOCK结构详解,讲解块结构,并且附有实例说明,对块的存储方式进行详细说明

    oracle数据块(block)结构详解

    NULL 博文链接:https://hbyuan.iteye.com/blog/850709

    oracle 数据库优化技术资料

    ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描. b. 通过ROWID访问表 你可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)...

    Oracle如何更改表空间的数据文件位置详解

    Oracle的表空间属于Oracle中的存储结构,是一种用于存储数据库对象(如:数据文件)的逻辑空间,是Oracle中信息存储的最大逻辑单元,其下还包含有段、区、数据块等逻辑数据类型。表空间是在数据库中开辟的一个空间,...

    Oracle语句优化30个规则详解

    ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描。  b. 通过ROWID访问表  你可以采用基于ROWID的访问方式情况,提高访问表的效率, ROWID包含了表中记录的物理位置信息……ORACLE采用索引(INDEX...

    Oracle 簇的使用详解

    簇其实就是一组表,由一组共享相同数据块的多个表组成,将经常一起使用的表组合在一起成簇可以提高处理效率;在一个簇中的表就叫做簇表。建立顺序是:簇→簇表→簇索引→数据创建簇的格式CREATE CLUSTER cluster_...

    oracle详解

    ·源数据库与目标数据库一定要有相同大小的数据块 ·目标数据库不能有与迁移表空间同名的表空间 ·SYS的对象不能迁移 ·必须传输自包含的对象集 ·有一些对象,如物化视图,基于函数的索引等不能被传输 可以用以下的...

    Oracle中聚簇表Cluster Table使用图文详解

    Cluster是存储一组table的一种方法,这些table共享同一数据块中的某些相同column,并把不同table在这一共享column上值相同的data row存储到同一block上。在sql server中的cluster index强制行根据index key按存储...

    Oracle 行迁移与行链接的实验详解

    当一条记录被更新的时候,数据库引擎首先会尝试在它保存的数据块中寻找足够的空闲空间,如果没有足够的空闲空间可用,这条记录将被拆分为两个部分,第一个部分包括指向第二部分的rowid,该部分任然保留在原来的数据...

    RHEL5.5+Drbd+Heartbeat+Oracle10R2架构详解

    Drbd、Heartbeat 文件版本及简介: Cluster-Resource-Agents-agents-1.0.3.tar....通过网络通信来同步镜像整个定义的块设备,确保本地节点与远程节点的数据可以保证实时地同步,并保证IO的一致性,以达到高可用的目的。

    Oracle表碎片整理操作步骤详解

    高水位线(HWL)下的许多数据块都是无数据的,但全表扫描的时候要扫描到高水位线的数据块,也就是说oracle要做许多的无用功!因此oracle提供了shrink space碎片整理功能。对于索引,可以采取rebuild online的方式...

    非常全的oracle文档

    五、 Oracle术语解释详解(摘自网络) 20 4.1. 数据库名 21 4.2. 数据库实例名 23 4.3. 数据库域名 24 4.4. 数据库服务名 24 六、 SYS和SYSTEM用户 25 七、 启动Oracle 25 八、 Oracle管理工具介绍 26 九、 查看Oracle...

    Oracle优化53解

    ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描。 b. 通过ROWID访问表 你可以采用基于ROWID的访问方式情况,提高访问表的效率, ROWID包含了表中记录的物理位置信息……ORACLE采用索引...

    Oracle表的分类以及相关参数的详解

    3、聚簇表:几张表物理存储在一块,通常是同一个数据块上。包含相同聚簇码值的所有数据在物理上存储在一起,数据”聚集”在聚簇码周围,聚簇码用B*Tree索引构建。4、散列聚簇表:和聚簇表相似,但是不是用B*Tree索引...

    Oracle数据库中的基本建库操作详解

    图形建库: 1. 确定是否存在要建的库  查看 $ORACLE_BASE/admin/和$ORACLE_BASE/oradata ...PGA系统内存,数据为主)|Sizing中的块大小只能在初始的配置中修改,SGA每个用户对应一个进程,PGA一个连接池供用

    oracle学习经典教程

    1.2 索引详解..................28 1.2.1 索引介绍.........28 1.2.1.1 索引的创建语法......28 1.2.1.2 索引特点..................28 1.2.1.3 索引不足..................29 1.2.1.4 应该建索引列...

    JVM原理之运行时数据区详解

    关于运行时数据官方解释:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5 4.1 堆 (heap) 堆在虚拟机中是一块共享区域, 存放 对象实例 和数组; 堆在虚拟机启动的时候创建。 可调整堆的...

Global site tag (gtag.js) - Google Analytics