当前位置:首页 » 编程博文
开发技术指南» 文章正文
    引言: 一、行迁移/行链接的介绍
 

 

 ·md5算法实现    »显示摘要«
    摘要:-摘抄于网络md5算法实现 1、md5算法是对输入的数据进行补位,使得如果数据位长度len对512求余的结果是448。 即数据扩展至k*512+448位。即k*64+56个字节,k为整数。 具体补位操作:补一个1,然后补0至满足上述要求 2、补数据长度: 用一个64位的数字表示数据的原始长度b,把b用两个32位数表示。这时,数据就被填 补成长度为512位的倍数。 3. 初始化md5参数 四个3......
 ·md5加密算法在vb中的实现     »显示摘要«
    摘要:-摘抄于网络´ md5加密算法在vb中的实现 option explicit dim w1 as string, w2 as string, w3 as string, w4 as string function md5f(byval tempstr as string, byval w as string, byval x as string, byval y as st......


关于Oracle数据库中行迁移/行链接的问题
一.行迁移/行链接的介绍

那究竟什么是行迁移/行链接呢,先让我们从oracle的block开始谈起. 【程序编程相关:InstallShield Develo

在实际的工作中我们经常会碰到一些oracle数据库性能较低的问题,当然,引起oracle数据库性能较低的原因是多方面的,我们能够通过一些正确的设计与诊断来尽量的避免一些oracle数据库性能不好,row migration (行迁移) & row chaining (行链接)就是其中我们可以尽量避免的引起oracle数据库性能低下的潜在问题.通过合理的诊断行迁移/行链接,我们可以较大幅度上提高oracle数据库的性能. 【推荐阅读:Vs2003-无法启动调试。 不支持此接

【扩展信息:权限管理的一点思路

操作系统的最小读写操作单元是操作系统的block,所以当创建一个oracle数据库的时候我们应该讲数据库的block size设置成为操作系统的block size的整数倍,oracle block是oracle数据库中读写操作的最小单元,oracle9i之前的oracle数据库版本中oracle block一旦在创建数据库的时候被设定后就没法再更改.为了在创建数据库之前确定一个合理的oracle block的大小,我们需要考虑一些因素,例如数据库本身的大小以及并发事务的数量等.使用一个合适的oracle block大小对于数据库的调优是非常重要的.

一个oracle block由三个部分组成,分别是数据块头.自由空间.实际数据三部份组成.

数据块头:主要包含有数据块地址的一些基本信息与段的类型,以及表与包含有数据的实际行的地址.

自由空间:是指可以为以后的更新与插入操作分配的空间,大小由pctfree与pctused两个参数影响.

实际数据:是指在行内存储的实际数据.

  当创建或者更改任何表与索引的时候,oracle在空间控制方面使用两个存储参数:

  pctfree:为将来更新已经存在的数据预留空间的百分比.

  pctused:用于为插入一新行数据的最小空间的百分比.这个值决定了块的可用状态.可用的块时可以执行插入的块,不可用状态的块只能执行删除与修改,可用状态的块被放在freelist中.

  当表中一行的数据不能在一个数据block中放入的时候,这个时候就会发生两种情况,一种是行链接,另外一种就是行迁移了.

  行链接产生在第一次插入数据的时候如果一个block不能存放一行记录的情况下.这种情况下,oracle将使用链接一个或者多个在这个段中保留的block存储这一行记录,行链接比较容易发生在比较大的行上,例如行上有long.long raw.lob等数据类型的字段,这种时候行链接是不可避免的会产生的.

  当一行记录初始插入的时候事可以存储在一个block中的,由于更新操作导致行长增加了,而block的自由空间已经完全满了,这个时候就产生了行迁移.在这种情况下,oracle将会迁移整行数据到一个新的block中(假设一个block中可以存储下整行数据),oracle会保留被迁移行的原始指针指向新的存放行数据的block,这就意味着被迁移行的row id是不会改变的.

  当发生了行迁移或者行链接,对这行数据操作的性能就会降低,因为oracle必须要扫描更多的block来获得这行的信息.

  下面举例来具体说明行迁移/行链接的产生过程.

  先创建一个pctfree为20与pctused为50的测试表:

  create table test(

  col1 char(20),

  col2 number)

  storage (

  pctfree 20

  pctused 50);

  当插入一条记录的时候,oracle会在free list中先去寻找一个自由的块,并且将数据插入到这个自由块中.而在free list中存在的自由的块是由pctfree值决定的.初始的空块都是在free list中的,直到块中的自由空间达到pctfree的值,此块就会从free list中移走,而当此块中的使用空间低于pctused的时候,此块又被重新放到free list中.

  oracle使用free list机制可以大大的提高性能,对于每次的插入操作,oracle只需要查找free list就可以了,而不是去查找所有的block来寻找自由空间.

 具体我们通过下面的一个试验来查看行链接与行迁移是如何产生并在数据文件中体现出来的.

 

先查看allan这个表空间的数据文件号,为了便于测试,我只建立了一个数据文件.

sql> select file_id from dba_data_files where tablespace_name=´allan´;

   file_id

----------

        23

创建一个测试表test:

sql> create table test ( x int primary key, a char(2000), b char(2000), c char(2000), d char(2000), e char(2000) ) tablespace allan;

table created.

因为我的数据库的db_block_size是8k,所以我创建的表有五个字段,每个占2000个字节,这样一行记录大约10k,就能超过一个block的大小了.

然后插入一行记录,只有一个字段的:

sql> insert into test(x) values (1);

1 row created.

sql> commit;

commit complete.

查找这行记录所在的block,并dump出来:

sql> select dbms_rowid.rowid_block_number(rowid) from test;

dbms_rowid.rowid_block_number(rowid)

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

                                  34

sql> alter system dump datafile 23 block 34;

system altered.

在udump目录下查看trace文件的内容如下:

start dump data blocks tsn: 34 file#: 23 minblk 34 maxblk 34

buffer tsn: 34 rdba: 0x05c00022 (23/34)

scn: 0x0000.013943f3 seq: 0x01 flg: 0x02 tail: 0x43f30601

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

block header dump:  0x05c00022

 object id on block? y

 seg/obj: 0x3ccd  csc: 0x00.13943ef  itc: 2  flg: o  typ: 1 - data

     fsl: 0  fnx: 0x0 ver: 0x01

itl           xid                  uba         flag  lck        scn/fsc

0x01   0x000a.02e.00000ad7  0x00800036.03de.18  --u-    1  fsc 0x0000.013943f3

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

data_block_dump,data header at 0xadb505c

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

tsiz: 0x1fa0

hsiz: 0x14

pbl: 0x0adb505c

bdba: 0x05c00022

     76543210

flag=--------

ntab=1

nrow=1

frre=-1

fsbo=0x14

fseo=0x1f9a

avsp=0x1f83

tosp=0x1f83

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

0x12:pri[0]     offs=0x1f9a

block_row_dump:

tab 0, row 0, @0x1f9a

tl: 6 fb: --h-fl-- lb: 0x1  cc: 1

col  0: [ 2]  c1 02

end_of_block_dump

end dump data blocks tsn: 34 file#: 23 minblk 34 maxblk 34

对其中的一些信息做一些解释:

fb:h是指行记录的头,l是指行记录的最后一列,f是指行记录的第一列.

cc:列的数量

nrid:对于行链接或者行迁移来说的下一个row id的值

由上面的dump信息我们可以看出来当前表test是没有行链接或者行迁移的.

然后更新test表,并重新dump出来:


...   下一页
    摘要:作者:網中人承接上一章所介紹的 command line ,這裡我們用 echo 這個命令加以進一步說明。 溫習---標準的 command line 包含三個部件: * command_name option argument echo 是一個非常簡單、直接的 linux 命令: * 將 argument 送出至標準輸出(stdout),通常就是在監視器(monitor)上輸出。 (註:stdo......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE