Oracle数据库个人技巧-行链接和行迁移的秘密.docx

Oracle数据库个人技巧-行链接和行迁移的秘密.docx

  1. 1、本文档共36页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

?

?

Oracle个人技巧--行链接和行迁移的秘密

?

?

一、概述:

如果你的Oracle数据库性能低下,行链接和行迁移可能是其中的原因之一。我们能够通过合理的设计或调整数据库来阻止这个现象。

行链接和行迁移是能够被避免的两个潜在性问题。我们可以通过合理的调整来提高数据库性能。本文主要描述的是:

什么是行迁移与行链接

如何判断行迁移与行链接

如何避免行迁移与行链接

当使用索引读取单行时,行迁移影响OLTP系统。最糟糕的情形是,对所有读取操作而言,增加了额外的I/O。行链接则影响索引读和全表扫描。

注:在翻译行(row)时使用记录来描述(便于理解),如第一行,使用第一条记录。

二、Oralce块

操作系统块的大小是操作系统读写的最小操作单元,也是操作系统文件的属性之一。当创建一个数据库时,选择一个基于操作系统块的

整数倍大小作为Oracle数据库块的大小。Oracle数据库读写操作则是以Oracle块为最小单位,而非操作系统块。一旦设置了Oracle数据块的大小,

则在整个数据库生命期间不能被更改(除Oracle9i之外)。因此为Oracle数据库定制合理的Oralce块大小,象预期数据库总大小以及并发用户数这些

因素应当予以考虑。

数据库块由下列逻辑结构(在整个数据库结构下)

头部

头部包含一些常用信息,象块地址,段的类型(表段、索引段等)。也包含一些表、实际数据行的地址信息等。

空闲空间

用于保留给后续DML(update/insert)操作的空间。通常受pctfree和pctused参数的影响。

数据

实际的数据内容

FREELIST,PCTFREE,PCTUSED

当创建或修改任意表,索引时。Oracle使用两个存储参数来控制空间的分配

PCTFREE为已存在数据将来更新需要保留空闲空间的百分比

PCTUSED新插入数据可使用空间的最小百分比,该值决定块何时回收到freelist结构中

FREELISTOracle通过维护该列表来记录或更新所有可用的数据块

Oracle首先在freelist列表上搜索可用的空闲数据块,搜索成功之后将数据插入到那个空闲块。块在freelist列表中的可用性由pctfree

参数值来决定。起初一个空块在freelist列表上列出,并且会一直保留,直到到空闲空间达到pctfree设定的值。

当一个块被使用且达到pctfree设定的值之后则该块从freelist列表被移除,而当数据块的可用空间低于PCTUSED值的时候,该块又会回收,

即重新回到freelist列表。

Oracle使用freelist方式以提高数据库性能。因此,每一个insert操作,Oracle仅仅需要搜索freelist结构,而不是搜索所有数据块。

三、行迁移:

当一个行上的更新操作(原来的数据存在且没有减少)导致当前的数据不能在容纳在当前块,我们需要进行行迁移。一个行迁移意味着整

行数据将会移动,仅仅保留的是一个转移地址。因此整行数据都被移动,原始的数据块上仅仅保留的是指向新块的一个地址信息。

迁移行不影响全表扫描

当使用全表扫描时,转移地址被忽略。因为我们最终能够获得所有的数据,所以能够忽略其转移地址。因此行迁移并不会对全表扫描产

生额外的操作。

迁移行对索引读产生额外的I/O

当使用索引读取数据时将产生额外的I/O。这是由于索引告诉我们通过文件X,块Y,slot槽Z可以获得该行数据。但是当我们根据地址信息

达到所在位置时,从其转移地址得知,其真实的数据是存储在文件A,块B,slot槽C上。因此为了寻找该行数据不得不产生额外的逻辑或物理I/O。

四、行链接

当一行数据太大而不能在一个单数据块容纳时,行链接由此产生。举例来说,当你使用了4kb的Oracle数据块大小,而你需要插入一行

数据是8k,Oracle则需要使用3个数据块分成片来存储。因此,引起行链接的情形通常是,表上行记录的大小超出了数据库Oracle块的大小。

表上使用了LONG或LONGRAW数据类型的时候容易产生行链接。其次表上多于255列时Oracle会将这些过宽的表分片而产生行链接。因此,

与行迁移所不同的是,行迁移是将数据存放到另外一个块,而行链接是数据同时位于多个数据块。

行链接有着不同于行迁移的影响,取决于我们所需的数据。如果我们有一行数据有两个列且跨越两个数据块。假定使用下面的查询:

SELECTcolumn1FROMtable

列1位于第一块,它将不会引起任何tablefetchcontinuedrow。由于不需要获得第2列的信息,因此行链接没有任何影响。然而,如

果我们使用下

文档评论(0)

134****9237 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档