ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 表的存储

表的存储

原创 Linux操作系统 作者:周应侯 时间:2012-03-28 13:28:06 0 删除 编辑
如何思考
oracle是有生命的,有自己的思维
oracle的块不是基本的io单位,而是oracle的基本访问单位
oracle每个表空间都有唯一的块大小,db_block_size定义的不再是数据库块的大小,而是缺省表空间块大小
块连续是逻辑上的连续,而不是物理的连续
当创建一个表的时候,oracle会自动为这个表创建段,并分配第一个扩展,
initrans这个参数指定了初始化事务槽的数据量
行链~ varchar2 ----不合理的pctfree会导致大量行链的出现
表空间最大的危害是浪费了空间,而不是影响了性能,所有数据的访问都会在有效的extent中进行,根本不会去扫描碎片所载的数据块

不合理的pctfree肯能导致大量行链的出现,影响访问性能
有些行链是不可以避免的,而行迁移是可以避免的

create table test1(a integer,b varchar2(100),c varchar2(100));
insert into test1 values(1,null,'aaaa');
insert into test1 values(2,null,'bbbb');
insert into test1 values(1,'11111',null);
commit;
然后我们查找一下这个extent所在位置;
select extent_id,file_id,block_id from dba_extents where
segment_name='TEST1' AND WNER='SCOTT';
我们先查找一下4号文件是什么?
select file_name from dba_data_fiiles where file_id=4;
下面通过dd命令将
dd if=F:\APP\ADMINISTRATOR\ORADATA\ZHOUHUAN\ZHOUHUAN01.DBF f=c:\a.dmp bs=8192 skip=465476 count=1
2c   01   03   02 c1 02   FF   04 61 61 61 61
就是我们插入的第一条记录(1,null,'aaaa')
2c是行头,这是一个标准的数据行,
01表示该行使用了1号itl槽,
03表示这一条记录共有多少个字段(本例子有3个字段)
02 c1 02是第一个字段的值,这个字段是数值类型,02表示该字段的长度,c1 02就是10进制的1;
select
FF表示第二个字段是空值
后面的04 61 61 61 61 是最后一个字段aaaa
oracle预留的这部分空间就是为varchar2字段的扩展提供空间,
oracle的数据块是从块的底部开始使用的,空闲空间在块头和数据之间
一旦原有的块满了,这个记录就就被迁移到别的数据块中,而在这条记录原本存放的位置,放入一个指针,在这种情况下,如果我们访问这条记录,就需要读取这个指针之后,再访问另外一个数据块,

pctfree是可以动态修改的,但是只对修改后的数据生效,所以要想彻底解决行迁移的问题,必须调整参数后,对表进行重组,才能对表中所有的数据块都起作用,对表重组的办法很多:alter table move 或者exp、imp
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22815499/viewspace-719718/,如需转载,请注明出处,否则将追究法律责任。

上一篇: lock
下一篇: awr学习
请登录后发表评论 登录
全部评论

注册时间:2009-11-03

  • 博文量
    56
  • 访问量
    143914