row chain:When a row is too large to fit into any block, row chaining occurs. In this case, the Oracle devide the row into smaller chunks. each chunk is stored in a block along with the necessary poiters to retrive and assemble the entire row.
row migration:when a row is to be updated and it cannot find the necessary free space in its block, the Oracle will move the entire row into a new block and leave a pointer from the orginal block to the new location. This process is called row migration.
行链接(Row chaining) 与行迁移(Row Migration)
当一行的数据过长而不能插入一个单个数据块中时,可能发生两种事情:行链接(row chaining)或行迁移(row migration)。
行链接
当第一次插入行时,由于行太长而不能容纳在一个数据块中时,就会发生行链接。在这种情况下,oracle会使用与该块链接的一块或多块数据块来容纳该行的数据。行连接经常在插入比较大的行时才会发生,如包含long, long row, lob等类型的数据。在这些情况下行链接是不可避免的。
行迁移
当修改不是行链接的行时,当修改后的行长度大于修改前的行长度,并且该数据块中的空闲空间已经比较小而不能完全容纳该行的数据时,就会发生行迁移。在这种情况下,Oracle会将整行的数据迁移到一个新的数据块上,而将该行原先的空间只放一个指针,指向该行的新的位置,并且该行原先空间的剩余空间不再被数据库使用,这些剩余的空间我们将其称之为空洞,这就是产生表碎片的主要原因,表碎片基本上也是不可避免的,但是我们可以将其降到一个我们可以接受的程度。注意,即使发生了行迁移,发生了行迁移的行的rowid 还是不会变化,这也是行迁移会引起数据库I/O性能降低的原因。其实行迁移是行链接的一种特殊形式,但是它的起因与行为跟行链接有很大不同,所以一般把它从行链接中独立出来,单独进行处理。
行链接和行迁移引起数据库性能下降的原因:
引起性能下降的原因主要是由于引起多余的I/O造成的。当通过索引访问已有行迁移现象的行时,数据库必须扫描一个以上的数据块才能检索到改行的数据。这主要有一下两种表现形式:
1) row migration 或row chaining 导致 INSERT 或 UPDATE语句的性能比较差,因为它们需要执行额外的处理
2) 利用索引查询已经链接或迁移的行的select语句性能比较差,因为它们要执行额外的I/O
如何才能检测到行迁移与行链接:
在表中被迁移或被链接的行可以通过带list chained rows选项的analyze语句识别出来。这个命令收集每个被迁移或链接的行的信息,并将这些信息放到指定的输出表中。为了创建这个输出表,运行脚本UTLCHAIN.SQL。
SQL> ANALYZE TABLE scott.emp LIST CHAINED ROWS;
SQL> SELECT * FROM chained_rows;
当然你也可以通过检查v$sysstat视图中的'table fetch continued row'来检查被迁移或被链接的行。
SQL> SELECT name, value FROM v$sysstat WHERE name = 'table fetch continued row';
NAME VALUE
---------------------------------------------------------------- ---------
table fetch continued row 308
尽管行迁移与行链接是两个不同的事情,但是在oracle内部,它们被当作一回事。所以当你检测行迁移与行链接时,你应该仔细的分析当前你正在处理的是行迁移还是行链接。
解决办法
o 在大多数情况下,行链接是无法克服的,特别是在一个表包含象LONGS, LOBs 等这样的列时。当在不同的表中有大量的链接行,并且哪些表的行的长度不是很长时,你可以通过用更大的block size重建数据库的方法来解决它。
例如:当前你的数据库的数据块的大小为4K,但是你的行的平均长度为6k,那么你可以通过用8k大小的数据块来重建数据库的办法解决行链接现象。
o 行迁移主要是由于设置的PCTFREE参数过小,导致没有给update操作留下足够的空闲空间引起。为了避免行迁移,所有被修改的表应该设置合适的PCTFREE 值,以便在每个数据块内为数据修改保留足够的空间。可以通过增加PCTFREE值的办法来避免行迁移,但这种解决办法是以牺牲更多的空间为代价的,这也就是我们通常所说的以空间换效率。 而且通过增加PCTFREE值的办法只能缓解行迁移现象,而不能完全解决行迁移,所以较好的办法是在设置了合适的PCTFREE值的后,在发现行迁移现象比较严重时,对表的数据进行重组。下面是对行迁移数据进行重组的步骤(这种方法也被成为CTAS):
-- Get the name of the table with migrated rows:
ACCEPT table_name PROMPT 'Enter the name of the table with migrated rows: '
-- Clean up from last execution
set echo off
DROP TABLE migrated_rows;
DROP TABLE chained_rows;
-- Create the CHAINED_ROWS table
@.../rdbms/admin/utlchain.sql
set echo on
spool fix_mig
-- List the chained and migrated rows
ANALYZE TABLE &table_name LIST CHAINED ROWS;
-- Copy the chained/migrated rows to another table
create table migrated_rows as
SELECT orig.*
FROM &table_name orig, chained_rows cr
WHERE orig.rowid = cr.head_rowid
AND cr.table_name = upper('&table_name');
-- Delete the chained/migrated rows from the original table
DELETE FROM &table_name WHERE rowid IN (SELECT head_rowid FROM chained_rows);
-- Copy the chained/migrated rows back into the original table
INSERT INTO &table_name SELECT * FROM migrated_rows;
spool off
当对一个表进行全表扫描时,我们实际上忽略行迁移中各个指向其它行的指针,因为我们知道,全表扫描会遍历全表,最终会读到发生行迁移的行的行数据,在此时才会处理这些行数据。因此,在全表扫描中,行迁移不会引发其它额外的工作。
当通过索引读一个表的数据时,被迁移的行会引起额外的I/O操作。这是因为从所引中我们会读到数据行的rowid,它告诉数据库到指定文件的指定数据块的指定slot上可以找到需要的数据,但是因为发生了行迁移,此处只存放一个指向数据的指针,而不是真正的数据,所以数据库又需要根据该指针(类似rowid)到指定文件的指定数据块的指定slot上去找真正的数据,重复上面的过程,知道找到真正的数据。我们可以看出,这会引入额外的I/O操作。
如何或知行迁移(行链接)严重的表呢?
DBA_TABLES视图的CHAINED_CNT列,该列有该表的链接行计数。
参考:http://bbobb.itpub.net/post/69/13517
TOAD有此功能,原理类似:database --> optimize --> repair chained rows ....
ANALYZE TABLE &table_name LIST CHAINED ROWS; 此语法并不更改statistics(统计数据),表中的chain_cnt行等
dbms_stats 包并不能收集chain_cnt此类信息,仍然要使用analyze table compute statistics 语句。
分享到:
相关推荐
### Oracle行链接和行迁移详解 #### 一、概述 Oracle数据库中,行链接和行迁移是两种可能影响数据库性能的现象。了解这两种现象的发生原因及其处理方法对于优化Oracle数据库至关重要。 #### 二、Oracle块 Oracle...
在Oracle数据库中,行迁移(Row Migration)和行链接(Row Chaining)是两种与数据存储和空间管理紧密相关的现象。这两个概念对于理解和优化数据库性能至关重要。 行迁移是指当一个数据库行在一个分配的块中无法...
《Oracle8i行链接和行迁移探析》这篇文章主要探讨了Oracle数据库中行迁移和行链接的概念、影响以及如何识别和处理这两种现象。行迁移和行链接是Oracle数据库在处理数据更新时可能出现的问题,对数据库性能产生显著...
行迁移与行链接是Oracle数据库中常见的问题,通过合理的配置调整和表结构调整可以有效减少这些问题的发生,从而提升数据库的整体性能。对于已经发生的行迁移或行链接,可以采取上述解决措施进行优化。
内容概要:本文详细介绍了 Oracle19c 数据库中的行链接和行迁移概念,解释了 PCTFREE 和 PCTUSED 参数的作用及其对数据块空间管理的影响。通过具体的示例,说明了行链接和行迁移的发生条件和解决方法。并提供了实际...
如果你的Oracle数据库性能低下,行链接和行迁移可能是其中的原因之一。我们能够通过合理的设计或调整数据库来阻止这个现象。行链接和行迁移是能够被避免的两个潜在性问题。我们可以通过合理的调整来提高数据库性能。...
2. 表对象存储参数调整:通过调整表的存储参数,如PCTFREE、PCTUSED等,可以避免行迁移和行链接,减少额外的I/O请求,提高查询速度。 3. 表分区:对于大型数据表,分区技术可以将数据分散到多个物理位置,从而提高...
- **使用DBMS_SPACE_TOOL包**: 提供了一系列函数来检查表空间中的行迁移和行链接情况。 - **查询V$TABLESPACE**: 获取表空间的状态信息。 **8.3 行迁移/行链接的清除方法** - **重建表**: 最彻底的方法,但可能会...
在开始数据迁移之前,需要新建目标数据库链接。新建链接时,链接名建议与数据库名及模式名相同。例如,如果数据库名为 test0909,那么链接名也可以命名为 test0909。新建链接成功后,需要点击“确定”按钮以保存设置...
- **行迁移与链接的影响**:Coolyl深入探讨了行迁移和行链接现象,以及它们对数据库性能的影响,提出了解决方案,帮助优化数据库结构。 - **索引使用情况研究**:bzszp的索引研究文章对于理解索引如何影响查询速度...
* 验证和确认开放查询/链接服务器的正确实现(如果存在) * 验证和确认动态查询语句 * 验证和确认DCL语句、GRANT权限等(如果存在) * 验证和确认联结(join)和DML语句形式的各种输入的正确输出行为 用户定义的...
虚谷数据库迁移工具-XuguMigrator
SP1是微软对Windows操作系统的重要更新,包含了多项性能改进和安全增强,确保了Profwiz在执行迁移过程时的稳定性和安全性。 **Windows域迁移的必要性** Windows域迁移通常发生在以下几种情况: 1. **企业合并或...
3. SQLyog.dll和SciLexer.dll:这些都是动态链接库文件,SQLyog.dll可能是SQLyog的核心组件,而SciLexer.dll可能提供了代码编辑器的语法高亮和解析功能。 4. SQLyogEnt.exe:这是SQLyog的可执行文件,是用户与软件...