Row Chaining and Row Migration

Row Chaining and Row Migration
行链接和行迁移

Introduction
------------
介绍

This article discusses the difference between row chaining andmigration.
Guidelines are given on how to detect and resolve from thissituation.
本文主要讨论行链接和行迁移直接的不同。指导怎么发现和解决行链接和行迁移。

Concepts
--------
概念

There are two circumstances when this can occur, the data for a rowin a table
may be too large to fit into a single data block. 
This can be caused by either
row chaining or row migration.

Chaining
---------
行链接

Occurs when the row is too large to fit into one data block when itis first
inserted. In this case, Oracle stores the data for the row in achain of data
blocks (one or more) reserved for that segment. Row chaining mostoften occurs
with large rows, such as rows that contain a column of datatypeLONG, LONG RAW,
LOB, etc. Row chaining in these cases is unavoidable.
行链接产生在第一次插入数据时,如果一个block不能存放一行记录的情况下。在这种情况下Oracle将使用链  接一个或者多个在这个段中保留的block存储这一行记录。行链接容易出现在大行上,比如包含LONG, LONG RAW,
LOB等字段类型的行,行链接是不可能避免的。

Migration
----------
行迁移

Occurs when a row that originally fitted into one data block isupdated so
that the overall row length increases, and the block's free spaceis already
completely filled.  In this case, Oracle migratesthe data for the entire row
to a new data block, assuming the entire row can fit in a newblock.  Oracle
preserves the original row piece of a migrated row to point to thenew block
containing the migrated row: the rowid of a migrated row does notchange.
原来存放到一个block的行被更新,导致行的长度增加,而block的预留空间已使用完,这种情况下,oracle将整行数据迁移到一个新的block,oracle会保留被迁移的行的原始指针指向新的存放行数据的block,被迁移行的rowid不改变。

When a row is chained or migrated, performance associated with thisrow
decreases because Oracle must scan more than one data block toretrieve the
information for that row.
当一行发生链接或迁移,和这行有关的性能会下降,因为oracle如果取这行数据,必须扫描不止一个block。

o INSERT and UPDATE statements that cause migration and chainingperform poorly,
  because they perform additionalprocessing.
  产生行迁移和行链接的insert和update执行效率低。

o SELECTs that use an index to select migrated or chained rows mustperform
  additional I/Os.
  使用index的select查询迁移或者链接的行必须执行额外的I/O。
 

Detection
---------
检查

Migrated and chained rows in a table or cluster can be identifiedby using the
ANALYZE command with the LIST CHAINED ROWS option. This commandcollects
information about each migrated or chained row and places thisinformation into
a specified output table.  To create the tablethat holds the chained rows,
execute script UTLCHAIN.SQL.
使用带LIST CHAINEDROWS的ANALYZE命令,可以发现一个表或簇中迁移和链接的行。这个命令搜集关于迁移和链接的行的信息,并将信息记录到指定的表。执行UTLCHAIN.SQL创建记录迁移的行的表。

  SQL> ANALYZE TABLE scott.emp LIST CHAINEDROWS;
  SQL> SELECT * FROM chained_rows;
 
You can also detect migrated and chained rows by checking the
'table fetch continued row' statistic in the v$sysstat view.
通过v$sysstat的'table fetch continued row'也可以检查迁移和链接的行。

  SQL> SELECT name, value FROM v$sysstat WHEREname = 'table fetch continued row';
 
  NAME                                                                                                                                VALUE
  -------------------------------------------------------------------------
  table fetch continuedrow                                                                                          308

Although migration and chaining are two different things,internally they are
represented by Oracle as one.  When detectingmigration and chaining of rows
you should analyze carrefully what you are dealing with.
尽管行迁移和行链接两个是不同的,但是oracle内部把它作为一个来对待。当发现行迁移和行链接,你需要仔细分析你处理的是行迁移还是行链接。

Resolving
---------
解决

o In most cases chaining is unavoidable, especially when thisinvolves tables
  with large columns such as LONGS, LOBs,etc.  When you have a lot of chained
  rows in different tables and the average rowlength of these tables is not
  that large, then you might consider rebuildingthe database with a larger
  blocksize.
  多数情况下,行链接是无法避免的,尤其当牵扯的表包含LONGS,LOBs等列。如果在不同的表中有大连的链接行,并且这些的表的行平均长度不是太大,那可能需要考虑使用较大的blocksize重建blocksize。
 
  e.g.: You have a database with a 2K block size.Different tables have multiple
              large varchar columns with an average row length of more than2K.  Then this
              means that you will have a lot of chained rows because your blocksize is
              too small.  Rebuilding the database with a largerblock size can give you
              a significant performance benefit.
             
o Migration is caused by PCTFREE being set too low, there is notenough room in
  the block for updates.  Toavoid migration, all tables that are updated should
  have their PCTFREE set so that there is enoughspace within the block for updates.
  You need to increase PCTFREE to avoid migratedrows.  If you leave more free
  space available in the block for updates, thenthe row will have more room to
  grow.
  PCTFREE设置的太低,会导致行迁移,因为block没有为update留下充足的空间。为了避免行迁移,被update的表应该有可以满足update的PCTFREE设置。
 
 
  SQL Script to eliminate row migration :
  消除行迁移的sql脚本:
 
      -- Get thename of the table with migrated rows:
      ACCEPTtable_name PROMPT 'Enter the name of the table with migrated rows:'
 
      -- Clean upfrom last execution
      set echooff
      DROP TABLEmigrated_rows;
      DROP TABLEchained_rows;
 
      -- Createthe CHAINED_ROWS table
      @$ORACLE_HOME/rdbms/admin/utlchain.sql
      set echoon
      spoolfix_mig
      -- List thechained and migrated rows
      ANALYZETABLE &table_name LIST CHAINED ROWS;
     
      -- Copy thechained/migrated rows to another table
      create tablemigrated_rows as
          SELECT orig.*
          FROM &table_name orig, chained_rows cr
          WHERE orig.rowid = cr.head_rowid
              AND cr.table_name = upper('&table_name');
         
      -- Deletethe chained/migrated rows from the original table
      DELETE FROM&table_name WHERE rowid IN (SELECT head_rowid FROMchained_rows);
 
      -- Copy thechained/migrated rows back into the original table
      INSERT INTO&table_name SELECT * FROM migrated_rows;
 
      spooloff
 

  Alternative methods to eliminate the migratedrows are:
  - alter table move command
  - table level export / import

  Please note that these methods will rebuild theentire table rather then
  re-inserting the migrated rows.

Note
----

When you run the script in the document to clean up the chainedrows if the
table contains long raw columns, the script will fail with ORA-997:Illegal use
of LONG datatype. This error is normal as you cannot do a CTAS whenyou have
long raws. Also, by the nature of the long raw datatype, chainingis
unavoidable.


References
----------

Oracle? Database Administrator's Guide 10g Release 2 (10.2)


Search Words
------------

CHAINING MIGRATION ROW PCTFREE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值