乱谈1——BLOCK

一篇文章应该有个主题,这篇文章的主题就是关于 BLOCK 的,不过可能内容会杂一些,涉及的东西会多一些。[@more@]

BLOCKORACLE中最小的物理单位,在BLOCK上面是EXTENTSEGMENTDATAFILE。在ORACLE中的BLOCK的必须是操作系统的块大小的整数倍,下面是关于BLOCK大小的说明:

DB_BLOCK_SIZE

Caution: Set this parameter at the time of database creation. Do not alter it afterward.

DB_BLOCK_SIZE specifies (in bytes) the size of Oracle database blocks. Typical values are 4096 and 8192. The value of this parameter must be a multiple of the physical block size at the device level.

The value for DB_BLOCK_SIZE in effect at the time you create the database determines the size of the blocks. The value must remain set to its initial value.

For Real Application Clusters, this parameter affects the maximum value of the FREELISTS storage parameter for tables and indexes. Oracle uses one database block for each freelist group. Decision support system (DSS) and data warehouse database environments tend to benefit from larger block size values.

Parameter Type:

Integer

Default Value:

8192

Values:

2048 to 32768, but your operating system may have a narrower range

Dependencies:

None

Real Application Clusters:

You must set this parameter for every instance, and multiple instances must have the same value.

从上面的描述可以看得出来,ORACLE的块默认大小是8K,范围是2K32K2K32KORACLE中的范围,你的操作系统可能有自己的约束,就象在我的WINDOWS XP中,最大仅仅支持16KBLOCK SIZE。对于数据库的BLOCK SIZE的选择,一般说得是这样规律,如果是OLTP系统可以选用小一些的SIZE,这样减少大量并发时候在块上的争用,因为块越大,可以容纳的记录就越多,那么在同时对这些记录进行操作的时候产生块级争用的可能性就越大。如果是OLAP系统的话,可以尽量选用大一些的块,提高读的效率,因为在OLAP上并发的事务不会太多,而数据的大量的读则是个重要的问题,大一些的块可以容纳更多的记录,单块读和多块的效果会更好些。

我接触过OLTP系统,比如说社保的数据库,大型医院的数据库等,也接触过OLAP系统,比如说互联网公司的数据仓库,他们使用的是BLOCK SIZE都是8K,也就是默认值。但也见过一些很怪异的数据库,BLOCK SIZE4K。说他们怪异,并不是因为4K的块大小,因为对于一些繁忙的系统来说4K的块大小可能更加合适,但是在我并没有找到任何一个有说服力的理由来这样设置。生产库不应该是我们拿来的作实验的地方,要为生产库进行最合理的设置。在这样还得提到另外一点,新的技术并不一定是合适的技术,一定不要因为自己的原因来让客户为那么不需要东西的买单。我原来接触的一个市级的社保数据库,数据量并是不太大(当然,这是因为最近接触的都是数据仓库,在当时看来这个社保库也是不小的),他们的数据库用得是ORACLE 9I,采用两个结点的RAC,存储用得是裸设备,两台IBM的小型机,具体型号记不清楚了。他们的业务并没有这么的复杂,没有必要采用复杂的RAC和操作麻烦的裸设备,最可怕的是,他们那没有一个专职的DBA。所以说,一定要用合适的技术和设备,最好的不一定是合适的,合适的也不一定是最好的。这和找女朋友的道理也是一样的。^.^!

据说ORACLEBLOCK SIZE并一定非得是2K的幂,完全可以创建一个5K,或者15K的数据库,前一阵子一直想建个5K的数据库看看,可是由于很忙,关键是很懒,所以一直也没弄过。不过想想,5K的数据库也没什么特别的,仅仅是特别而已。

我们的数据库里面的绝大部分东西都是存储在BLOCK中的(之所以说绝大部分,是因为还有一些信息存储在初始化文件中,控制文件中,外部表中等等)。由于可见BLOCK对于数据库的重要性。而这些BLOCK中也有着不同的分工,有的负责存储表中的数据,有的负责存储索引中的数据,有的负责存储块的使用情况,有的负责存储UNDO的信息……不同的分工就有着不同的结构。我不想具体介绍这些不同功能的块的结构,因为这样文章已经很多了,去GOOGLE可以搜到成百上千,感兴趣的同学可以自己去查查看。从上面的BLOCK的分工看出来,并不是百分之百的BLOCK存储的都是那些对我们有用的信息;有些块对我们是没用的,但是对数据库正常运行确实有用的。假设一个块是数据块,存储的是我们的数据,那么在这个块内容的空间也不是百分百被我们使用的,也会有一部分是控制信息,存储正常运行的块的信息的。我们平时说的PTCFREEPCTUSED也是指的那些可用空间的百分比,并不是数据块大小的百分比。至于这部分控制信息到底会有多大的,这是和很多因素有关系的,比如说INITRANS的大小,INITRANS是控制表中每个块上的初始事务槽的大小,每个TRANS条目会占用24B的大小,INITRANS的大小是0255,那么当我们设置INITRANS等于255的时候会占用5.97K,那么是不是说当我们的数据库BLOCK大小是4K的时候,那么整个块都会存储TRANS的信息,而没有存储数据的地方呢?实际上,INITRANS的最大值还与BLOCK SIZE有关系,永远不会出现数据没有地方存储的情况,ORACLE会保证这一点的。

BLOCK里面的信息有没有值得我们深入研究的价值呢,这也是大家经常讨论的一个问题。到底深入的学习ORACLE有没有必要。我还能记得,几年前,我第一次能读懂DATA BLOCK块中的内容时候的兴奋,可以说我现在还能对ORACLE有着这么大的兴趣是和那时候是分不开的。从此我可能从另一个方面来理解ORACLE,当我执行INSERT的时候我会知道我正在对BLOCK进行操作,我会插入一条记录在数据块中;当我DELETE数据的时候,我会知道我仅仅是在BLOCK上打个标志,我并没真正的删除它,它还安稳的存储在BLOCK块中呢。这可能并没什么值得骄傲的,但却带给我很多满足感,带给我继续学习的动力,这种感觉很好。

接着来讨论BLOCK9I以前,BLOCK SIZE设置好后,如果想修改的话只能重新建立数据库。在9I的时候增加了表空间的传输功能,为了增加表空间传输的使用范围,ORACLE允许我们建立不同BLOCK SIZE的表空间。不同BLOCK SIZE的表空间主要是为了传输表空间的需要,有很多人也把它当成一种数据库调优的手段。我前面提到的BLOCK SIZE大小为5K的数据库从传输表空间的角度来说,可以称它是个封闭的数据库,因为除非有另外一个5K的数据库,否则你是不可能进行传输表空间的。需要传输的表空间必须是自包含的,这点需要记好。

今天先写这么多吧,其实还有好多关于BLOCK的东西没写呢。无奈啊,最近杭州降温,屋子里冷得象个冰窖,我的手已经不好用了,只能作罢。

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

转载于:http://blog.itpub.net/8394333/viewspace-998587/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值