TOP 第十二章 之 段头块的争用

| 5 Comments

继续贴出 Troubleshooting Oracle Performance 一书第十二章《优化物理设计》的翻译稿的部分节录。最近真是筋疲力竭。翻译不止是考验技术水平、英文水平、中文驾驭能力,还有耐心和信心。

TOP.jpg
(此书中文名字还未敲定,要不大家帮着命名一下?)



段头块的争用

每个表和索引段都会有一个头数据块(header block)。这个数据块包含以下元数据:关于这个段的高水位(highwatermark)的信息,组成这个段的区间(extent)的列表以及关于空闲空间的信息。为了管理空闲空间,根据使用的段空间管理方式的不同,头数据块会含有一个空闲列表(freelist)或者一组包含自动段空间管理(automatic segment space management)的信息的数据块。比较典型的情况是,段头数据块在多个进程并发地修改其内容时会发生争用。注意,头数据块在以下几种情形下将会发生修改:

  • 插入语句使得有必要提高高水位
  • 插入语句使得有必要分配新的区间
  • 删除、插入或更新语句使得有必要修改空闲列表

解决这些问题的一个可能思路是,对这个段进行分区以将压力分布到多个段头块上去。虽然有时候根据负载以及分区键值(partition key)其它的分区方式也可以实现,但是在大部分时候,可以通过散列分区实现这一点。然而,如果是由于第二或第三种情形导致这个问题,还可以使用其它的解决办法。对于第二种情形,可以使用更大的区间(extent)来解决。这样,新的区间分配将很少发生。对于第三种情形,空闲队列(freelist)可以被空闲队列组(freelist group)移动到其它数据块,这对于使用自动段空间管理模式(automatic segment space management)的表空间不适合。事实上,在使用多个空闲列表组的时候,空闲列表就不再被存储在段头数据块(segment header block)中了(它们被分布到与参数FREELIST GROUPS数量一致的数据块中,这样在它们上面的争用将减少,而不仅仅是将争用移往别处而已)。另一个可能是使用自动段空间管理的表空间而不是空闲列表段空间管理的表空间。

注意:长期存在一个关于Oracle数据库引擎的神话是,空闲列表组只有在使用RAC(Real Application Cluster)的时候才是有用的。大谬。空闲列表组在任何数据库中都是有用的。之所以特别强调这一点是因为我看到听到这种错误信息太多次了。


其实我一直想尝试用一点比较新的语言,比如最后一句,用"这种事儿我都听过N次了",效果可能更好。但,还是放弃了。

--EOF--

5 Comments

之所以特别强调这一点是因为我看到听到这种错误信息太多次了。
-----------------------
太多次了还是很硬啊,应该是“之所以特别强调这一点是因为我看到听到这种错误信息的次数太多了。”更合适些吧

关于这个段的高水位(highwatermark)的信息,组成这个段的区间(extent)的列表以及关于空闲空间的信息。

“这个段”是否就是指前面说的“索引段”?如果是,改成“索引段”更通畅。

头数据块建议翻译成数据块头,个人觉得这样更顺口,后面应该还有数据块尾吧,尾数据块?

居然还可以登录Google帐号发布评论?
如何实现?

[quote]
头数据块建议翻译成数据块头,个人觉得这样更顺口,后面应该还有数据块尾吧,尾数据块?
[/quote]
header block 是segment header里面的一个特殊的数据块, 这个块的信息是用来来概括整个segment的.

翻译成数据块头, 个人觉得容易被理解成数据块内部的头部信息. 而不是一个特殊的数据块了..

另外概念上不存在tail block(一个独立的block)的概念, 只有tail of block(block内部的tail部分)的概念.