[20160806]ROWDEPENDENCIES.txt

[20160806]ROWDEPENDENCIES.txt

---今天看一些文档,突然想起几天前做的行迁移与itl槽的测试:
http://blog.itpub.net/267265/viewspace-2122712/

[20150720]为什么8K数据块Hakan Factor=736
http://blog.itpub.net/267265/viewspace-1742243/

--大家知道oracle如果一块发生dml操作,有1个伪列ora_rowscn记录最后的scn,但是不能通过这个定位对那条记录进行了操作.
--但是如果表定义使用ROWDEPENDENCIES,这样每行都会记录一个scn,scn占48位,需要6个字节保存这个信息.这样就在需要消耗
--6个字节加上行迁移需要保留rowid信息,这样6+6+3+2=17(6 scn+ 6 rowid+ 3 flag,lock,cols+2 行目录).

--测试看看:

1.建立测试环境:
SCOTT@test01p> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

create table t  (id number,pad varchar2(200)) ROWDEPENDENCIES;
alter table t pctfree 0;
create unique index pk_t on t(id);
alter table t add constraint pk_t primary key (id) enable validate;

insert into t(id)   select rownum from dual connect by level<=734;
commit ;

2.测试:
SELECT obj#, dataobj#, spare1
  FROM sys.tab$
 WHERE obj# IN (SELECT object_id
                  FROM dba_objects
                 WHERE owner = USER AND object_name  in ('T','DEPT'));

      OBJ#   DATAOBJ#     SPARE1
---------- ---------- ----------
    105250     105250        476
     92285      92285        736

--^_^,spare1=476,说明在表设置ROWDEPENDENCIES的情况下最大1块(8k).仅仅能保存476条记录.

SCOTT@test01p> select rowid,t.* from t where  id=1;
ROWID                      ID PAD
------------------ ---------- -------------------------
AAAZsiAAJAAAACOAAA          1

SCOTT@test01p> @ rowid AAAZsiAAJAAAACOAAA
    OBJECT       FILE      BLOCK        ROW DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
    105250          9        142          0 9,142                alter system dump datafile 9 block 142 ;

--通过bbed观察:

BBED> set dba 9,143
        DBA             0x0240008f (37748879 9,143)
--//注我bbed使用for windows的版本,存在1个偏移.以下不在说明.

BBED> map
 File: D:\APP\ORACLE\ORADATA\TEST\TEST01P\SAMPLE_SCHEMA_USERS01.DBF (9)
 Block: 143                                   Dba:0x0240008f
------------------------------------------------------------
 KTB Data Block (Table/Cluster)
 struct kcbh, 20 bytes                      @0
 struct ktbbh, 72 bytes                     @20
 struct kdbh, 14 bytes                      @100
 struct kdbt[1], 4 bytes                    @114
 sb2 kdbr[474]                              @118
 ub1 freespace[1063]                        @1066
 ub1 rowdata[6059]                          @2129
 ub4 tailchk                                @8188

-- (8192-4-118)/(6+6+3+2)=474.7058823529411764758, 大约474与476非常接近.我估计oracle计算仅仅考虑1个itl槽.这样计算修改如下
-- (8192-4-118+24)/(6+6+3+2)=476.1176475882352941176, 基本接近476.

-- sb2 kdbr[474]                              @118
-- //说明这个块仅仅保存了474条记录.与实际的测试非常接近.
-- //关于行迁移的测试不作了,没有意思.

3.看一些细节:
BBED> x /r  *kdbr[1]
rowdata[2857]                               @4986
-------------
flag@4986: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@4987: 0x01
cols@4988:    1
col    0[2] @4995:  0xc1  0x03

BBED> x /r  *kdbr[0]
rowdata[2845]                               @4974
-------------
flag@4974: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@4975: 0x01
cols@4976:    1
col    0[2] @4983:  0xc1  0x02

--bbed 不显示scn的相关信息.不过cols在4976偏移,而col0在4983,相减7. col0 前面有1个长度指示期,也就是两个之间保存的就是scn.
--//做一个转储看看:

SCOTT@test01p> alter system dump datafile 9 block 142 ;
System altered.

block_row_dump:
tab 0, row 0, @0x130a
tl: 12 fb: --H-FL-- lb: 0x1  cc: 1
dscn 0x0000.00000000
~~~~~~~~~~~~~~~~~~~~~~
col  0: [ 2]  c1 02

tab 0, row 1, @0x1316
tl: 12 fb: --H-FL-- lb: 0x1  cc: 1
dscn 0x0000.00000000
col  0: [ 2]  c1 03

--//注意~,当前是0,scn信息还保存在ITL槽中.

4.对比没有ROWDEPENDENCIES的表
SCOTT@test01p> select rowid from dept where rownum=1;
ROWID
------------------
AAAWh9AAJAAAACFAAA

SCOTT@test01p> @ rowid AAAWh9AAJAAAACFAAA
    OBJECT       FILE      BLOCK        ROW DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
     92285          9        133          0 9,133                alter system dump datafile 9 block 133 ;

BBED> set dba 9,134
        DBA             0x02400086 (37748870 9,134)

BBED> p kcbh
struct kcbh, 20 bytes                       @0
   ub1 type_kcbh                            @0        0x06
   ub1 frmt_kcbh                            @1        0xa2
   ub1 spare1_kcbh                          @2        0x00
   ub1 spare2_kcbh                          @3        0x00
   ub4 rdba_kcbh                            @4        0x02400085
   ub4 bas_kcbh                             @8        0x0166659d
   ub2 wrp_kcbh                             @12       0x0000
   ub1 seq_kcbh                             @14       0x02
   ub1 flg_kcbh                             @15       0x04 (KCBHFCKV)
   ub2 chkval_kcbh                          @16       0x054b
   ub2 spare3_kcbh                          @18       0x0000

--对比有ROWDEPENDENCIES的表:

BBED> set dba 9,143
        DBA             0x0240008f (37748879 9,143)

BBED> p kcbh
struct kcbh, 20 bytes                       @0
   ub1 type_kcbh                            @0        0x06
   ub1 frmt_kcbh                            @1        0xa2
   ub1 spare1_kcbh                          @2        0x00
   ub1 spare2_kcbh                          @3        0x00
   ub4 rdba_kcbh                            @4        0x0240008e
   ub4 bas_kcbh                             @8        0x016aad8f
   ub2 wrp_kcbh                             @12       0x0000
   ub1 seq_kcbh                             @14       0x01
   ub1 flg_kcbh                             @15       0x06 (KCBHFDLC, KCBHFCKV)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   ub2 chkval_kcbh                          @16       0xb996
   ub2 spare3_kcbh                          @18       0x0000

--注意看~, flg_kcbh记录的信息,有ROWDEPENDENCIES的表多1个KCBHFDLC属性.

时间: 2024-11-13 09:58:38

[20160806]ROWDEPENDENCIES.txt的相关文章

[20160806]12c 与 WMSYS.WM_CONCAT.txt

[20160806]12c 与 WMSYS.WM_CONCAT.txt --前几天有人问临时表空间消耗的问题,链接: http://www.itpub.net/thread-2065053-1-1.html --我提到11g的wmsys.wm_concat也会使用临时表空间. --链接:http://blog.itpub.net/267265/viewspace-1356256/ --但是在12c测试发现12c已经不存在WMSYS.WM_CONCAT,看来要建议开发不要在使用它连接字符串. --

[20160806]sqlplus 1000行自动提交.txt

[20160806]sqlplus 1000行自动提交.txt --同事要求我提交的插入脚本要求1000行有1个提交. --当时我自己也没有多想,因为toad有一个功能可以直接实现这个功能. 结果集上点击右键选择=>'export dataset': export format 选择 insert statments commit interval 选择1000,这样生成的sql脚本就是每隔1000条记录有1个提交. --假如已经生成了脚本,如何修好呢?以scott.dept表为例来说明: SE

[20121021]探究表的rowdependencies属性.txt

[20121021]探究表的rowdependencies属性.txt 使用bbed来探索表的rowdependencies属性. 实际上默认这个功能是不打开的,也就是采用norowdependencies方式,这样block的所有行会共享同一个SCN,如果执行DML操作, 这个SCN都是一样的在同一块中.而使用rowdependencies.每行都会有对应事务的scn.使用ora_rowscn可以查询到块中记录的SCN. SQL> select * from v$version; BANNER

[20130817]Oracle 12c new feature In-Database Archiving.txt

[20130817]Oracle 12c new feature In-Database Archiving_Information Life Cycle Management.txt 一些大表保存大量信息,里面的许多信息可能不再需要.而且保持这些信息,对备份以及恢复都带来影响. 12C提供新特性-In-Database Archiving,即 Information Life Cycle Management (ILM),保持新与旧的信息,仅仅显示新信息. 要使用这个新特性,系统会建立一个隐含

wince下,使用C# ,把数据写入txt文件中

问题描述 wince下,使用C# ,把数据写入txt文件中 各位高手大家好,我在wince下,使用C# ,把数据写入txt文件中,所有的代码都执行完成,也没有发生任何错误,但是我打开txt里面是空白的,没有任何数据,不知其解,望高手不吝指教,谢谢.写入txt的代码如下: FileStream fs = null; StreamWriter sw = null; try { fs = new FileStream(fileName, FileMode.Append, FileAccess.Writ

教你快速将多个TXT文档合并成一个

网上下载的文件常常会分割成好几个文件,阅读起来非常不便,本教程为大家介绍如何快速将多个txt文件合并. 文档合并成一个-快速合并word文档"> 同时选定需要合并的txt文档进行压缩 步骤1:首先选中需要合并的多个TXT文档,然后单击鼠标右键,在弹出的菜单中选中"Win-RAR-添加到压缩文件"命令,这时会出现"压缩文件名和参数"窗口,在"常规"标签页中对压缩文件进行命名,并将"压缩方式"下拉框中的"

txt文件-c++如何控制文件输出的行数?

问题描述 c++如何控制文件输出的行数? 我有一个几千行的txt文件,里面都是ascall字符,我想每次读取30行在控制台显示然后清屏,延迟0.1s后再输出接下来的30行,也就是第一次控制台输出1-30行,清屏,第二次输出31-60行,这样一直下去,直到文件末尾 1. 我希望在每次在控制台显示的时候一次性显示30行的字符,必须一次性显示30行,肉眼不能察觉到是一行一行显示出来的. 解决方案 自己做个计数就好了,30行后,计数清零,重新计数 解决方案二: #include #include #in

如何在java中实现读取一个txt文档中的随机一行

问题描述 如何在java中实现读取一个txt文档中的随机一行 如题,如何在java中实现读取一个txt文档中的随机一行? 主要就是怎么随机读取 解决方案 根据楼上的说法,来总结一下吧,总体来说,就是将文件全部都读取出来,每一行存储到一个数组或集合中,然后再通过产生随机数,来对这个数组或是 集合进行随机的访问.这样一来就解决了 解决方案二: 文本文件只能顺序读,不能随机读.你的需求只能是读取文本文件每一行到一个arraylist,然后得到下标范围,产生一个随机数,取那一行 解决方案三: http:

Word文档批量转换成TXT格式的技巧

使用Word编辑文档的时候,不仅可以保存成Word格式,也可以保存为其它格式.但有的时候需要将大批的已经编辑完成的Word文档转换成文本格式或其他格式文档,怎么办?如果通过"另存为"将是一件十分费时费力的事情. 可能有人说了利用第三方工具软件吧,那是另一话题.在这里笔者要告诉大家的是:批量转换文档格式不求"人",完全可以借助Word本身自带的功能就可以完成批量转换文档格式的工作.为了叙述方便,专家以将Word文档格式批量转换成TXT文本格式为例来介绍其转换过程,具体