在看某些文章中有写到,oracle在块中不会存储空列。我自己试了一把,发现叙述有误。现在将我的实验结果记录以下。
先上结论:
1、对于空值列不是最后一个字段的oracle会存储在块中,dump出来的值是:
col 0: *NULL*
col 1: *NULL*
col 2: [ 5] c4 03 07 3a 34
col 3: [ 7] 54 52 49 47 47 45 52
col 4: [ 5] 56 41 4c 49 44
col 5: [ 7] 78 9b 0c 0a 01 12 3a
col 6: [ 6] 61 62 63 31 32 33
2、空值的列是最后一个列,那么将不会存储在块中
tl: 55 fb: --H-FL-- lb: 0x0 cc: 6《===这个有6个列
col 0: *NULL*
col 1: [24]
53 59 53 5f 49 4c 30 30 30 30 30 38 36 34 36 36 43 30 30 30 30 39 24 24
col 2: [ 5] c4 03 07 3a 2a
col 3: [ 5] 49 4e 44 45 58
col 4: [ 5] 56 41 4c 49 44
col 5: [ 7] 78 9b 0c 09 0f 12 3a
tab 0, row 1, @0x334
tl: 40 fb: --H-FL-- lb: 0x1 cc: 7《===这个有7个列,表一共有7个列,对比证明结论2
col 0: *NULL*
col 1: *NULL*
col 2: [ 5] c4 03 07 3a 34
col 3: [ 7] 54 52 49 47 47 45 52
col 4: [ 5] 56 41 4c 49 44
col 5: [ 7] 78 9b 0c 0a 01 12 3a
col 6: [ 6] 61 62 63 31 32 33
实验方法
1、创建一个简单的表
2、插入一些数据
3、update为空值或者''
4、dump数据块
另外在实验中也发现,最后一个空值字段在update为非空并且commit后,不会立马更改块中的内容,需要等待数据刷入磁盘后,才会在dump文件中发现多一个列出来。