谢谢GerryYang(轻尘),luxuezhu(卢冲) 如何测试一下呢?
解决方案 »
- 删除表A和表B中相同的数据,删除的是那个表中的数据?
- Oracle中UTL_FILE读取文本时中文呈现乱码如何解决!
- 关于触发器的问题????????
- 触发器~~如何得到DML语句影响行数``````
- 关于分区里边再分区问题
- 晕了!我用的是oracle9201NT,无论如何建立不了management server!帮帮忙吧!
- 如何更改ORACLE数据库的编码
- 一个关于SQL语法的问题
- 运行FORMS 11设计的窗体提示要把字符设置为UTF8
- 想从存储过程中 得到一个结果集的一个值并赋值给变量
- 使用Oracle 9i 透明网关后,无法进入 OEM
- 在一台机器上可以同时装SQL Server和Oracle吗?
如果是在末尾 不占用
也许我的主页能帮上忙
http://l2g32003.home4u.china.comhttp://l2g32003.home4u.china.com/block/table_block.html 这个是table的情况 其中我解释了null的情况
这样的一个表结构
space
________________________________
ID | NUMBER(13)
________________________________
NAME | VARCHAR(100)
--------------------------------
AGE | NUMBER(13)做了测试,
1 往space表中插入20万条记录(ID,NAME,AGE)均非空,space表占据的字节数为9437184 bytes2 drop space表
3 重建space表
4 往space表中插入20万条记录(ID,NAME,AGE)均为null,space表占据的字节数为3145728 bytes,各字段值全为null时占的空间是均为非空的1/35 drop space表,并重建表space,修改表结构为
space
--------------------------------
ID | NUMBER(13)
--------------------------------
NAME | VARCHAR(100)
--------------------------------
AGE | NUMBER(13)
--------------------------------
SEX | VARCHAR(10)6 往space表中插入20万条记录(ID,NAME,AGE,SEX)均非空,space表占据的字节数为11534336 bytes7 如2,3
8 往space表中插入20万条记录(ID,NAME,AGE,SEX)均为null,space表占据的字节数为3145728 bytes
请大家分析一下上面的试验数据,
为什么步骤8与步骤4得到表占的字节数是一样的呢?
null占多少字节呢?
按您所说,如果null的列是在表的中间占用1字节
如果是在末尾 不占用
那表的第一列为null占字节吗?期盼得到大家的回复,谢谢
l2g32003的说法是正确的,不过你不要误解他“如果是在末尾 不占用”这句话。
所谓末尾是指最后的连续为NULL的列,
比如有四列:cl1,cl2,cl3,cl4 如果值为值为:1,1,1,null
那么,末尾就是cl4 如果值为:1,1,null,null
那么,末尾就是cl3,cl4 如果值全为NULL:null,null,null,null
那么,末尾就是全部列cl1,cl2,cl3,cl4。除了末尾情况,其它位置NULL都是占1字节
当为null的字段在一条记录的最后,就是说他后边没有非null的字段值时,是不占空间的
当为null的字段在一条记录的中间,就是说他后边还有非null的字段值时,他占一个字节
所以oracle建议在设计表结构时尽量把可空的字段放到最后!oracle文档中有说明的
A VARCHAR(10) B VARCHAR(10) C VARCHAR(10)
D VARCHAR(10) E VARCHAR(10) F VARCHAR(10)
insert into test values (null,null,null,null,null,null);
insert into test values ('1',null,null,'1',null,'1');
insert into test values(null,1,null,null,null,1);
commit;
提交后使用dunp查看各字段占空间的情况:
select A,dump(A),B,dump(B) from test;
得到如下结果:
A | DUMP(A) | B |DUMP(B)
-------------------------------------
| NULL | | NULL
-------------------------------------
1 |Typ=1 Len=1 | | NULL
-------------------------------------
| NULL | 1 |Typ=1 Len=1
对为null的字段进行dump后得到的结论是不占空间的,您指的null字节占一个字节空间的情况是什么原因?
ALTER SYSTEM DUMP DATAFILE file_No BLOCK block_No;
dump出来看trace文件
SQL> Create Table test (A VARCHAR(10), B VARCHAR(10), C VARCHAR(10),D VARCHAR(10), E VARCHAR(10), F VARCHAR(10));Table createdSQL> insert into test values (null,null,null,null,null,null);1 row insertedSQL> insert into test values ('1',null,null,'1',null,'1');1 row insertedSQL> insert into test values(null,1,null,null,null,1);1 row insertedSQL> COMMIT;Commit completeSQL> SELECT SQCTEST.GET_ROWID(ROWID) FROM TEST;SQCTEST.GET_ROWID(ROWID)
--------------------------------------------------------------------------------
Object# is :43637
Relative_fno is :18
Block number is :410671
Row number is :0Object# is :43637
Relative_fno is :18
Block number is :410671
Row number is :1Object# is :43637
Relative_fno is :18
Block number is :410671
Row number is :2
SQL> ALTER SYSTEM DUMP DATAFILE 18 BLOCK 410671;System altered
下面是trace结果的一部分:
block_row_dump:
tab 0, row 0, @0x1f95
tl: 3 fb: --H-FL-- lb: 0x1 cc: 0 //这是第一行数据长度TL是3,CC存储列数是0。(这就是全部为NULL的记录,没有记录任何NULL值)
tab 0, row 1, @0x1f89
tl: 12 fb: --H-FL-- lb: 0x1 cc: 6 //这是第二行数据长度TL是12=3+2+1+1+2+1+2,CC存储列数是6。(记录了中间三个NULL值,每个为1)
col 0: [ 1] 31
col 1: *NULL*
col 2: *NULL*
col 3: [ 1] 31
col 4: *NULL*
col 5: [ 1] 31
tab 0, row 2, @0x1f7e
tl: 11 fb: --H-FL-- lb: 0x1 cc: 6 //这是第三行数据长度TL是11=3+1+2+1+1+1+2,CC存储列数是6。(记录了中间四个NULL值,每个为1)
col 0: *NULL*
col 1: [ 1] 31
col 2: *NULL*
col 3: *NULL*
col 4: *NULL*
col 5: [ 1] 31
end_of_block_dump
谢谢,请您再解释一下,
SELECT SQCTEST.GET_ROWID(ROWID) FROM TEST;//SQCTEST.GET_ROWID(ROWID)ALTER SYSTEM DUMP DATAFILE 18 BLOCK 410671;// 18,410671代表什么以及如何查看trace文件,谢谢,太感谢了
410671代表block_id
这些信息你也可以通过dba_extents获取
如果在ASSM下就要+6
create or replace function get_rowid
(l_rowid in varchar2)
return varchar2
is
ls_my_rowid varchar2(200);
rowid_type number;
object_number number;
relative_fno number;
block_number number;
row_number number;
begin
dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno, block_number, row_number);
ls_my_rowid := 'Object# is :'||to_char(object_number)||chr(10)||
'Relative_fno is :'||to_char(relative_fno)||chr(10)||
'Block number is :'||to_char(block_number)||chr(10)||
'Row number is :'||to_char(row_number);
return ls_my_rowid ;
end;
/18 , 410671 分别对应函数输出的数据文件号relative_fno ,数据blockid:block_number