消除行链接、行迁移

行迁移和行链接是经常接触到的一个概念。行链接是记录太大,一个数据块无法存储,oracle就会将其存储在相链接的块中,如果记录中数据类型包括:LONG、LONG RAW、LOB等数据类型时,行链接则无法避免了,可以在AWR实例活动统计部分的table fetch continued row分析可以看出当前数据库中链接行的数量;行迁移是指在update时,数据块已满,记录更新后记录长度增加了,oracle会将整条记录迁移到新的块中,行迁移后ROWID是不变的。参考ID 102989.1消除行链接和行迁移。

How to Find and Eliminate Migrated and Chained Rows (文档 ID 102989.1)

修改时间:2013-3-2类型:BULLETIN


***Checked for relevance on 11-Jan-2012***

PURPOSE
-------

How to find and eliminate migrated or chained rows.

SCOPE & APPLICATION
-------------------

Step by step example.

How to find and eliminate Migrated and Chained rows
---------------------------------------------------

CONCEPTS:

* A row Migrates when a block was found to have the space available for
  a row which underwent an update that increased its size over and beyond
  its block‘s available space.

* A Chained row occurs when there is no block which can hold the row after
  it underwent an update which increased its size beyond the available free
  space in its hosting block. The solution is to split the row over several
  blocks.          

CAUSES and EFFECTS:

* Causes for migrated and chained rows:  Inserts, updates and deletes over
  periods of time

* Results from migrated and chained rows:  Degraded response for queries.

SOLUTION:

1)  Analyze the table:

    To prevent an ORA-1495 (specified chained row table not found), run the
    $ORACLE_HOME/rdbms/admin/utlchain.sql script.

    TRUNCATE TABLE CHAINED_ROWS;
    ANALYZE TABLE <table name> LIST CHAINED ROWS;

2)  List the Migrated or Chained rows. 

    From SQL*Plus:

    col owner_name format a10
    col table_name format a20
    col head_rowid format a20

    select owner_name, table_name, head_rowid from chained_rows;

3)  You can now eliminate the Migrated or Chained rows by Create Table
    as Select (CTAS), exporting and then importing the table or by following
    the next steps:

    A) Create an empty copy of the table that has the Migrated or Chained rows.

       CREATE TABLE <temporary table name> AS
        SELECT * FROM <table name> WHERE ROWID IN
         (SELECT HEAD_ROWID FROM CHAINED_ROWS WHERE TABLE_NAME=‘<table name‘>‘);

    B) Now delete the Migrated and Chained rows from the table.  

       DELETE FROM <table name> WHERE ROWID IN
        (SELECT HEAD_ROWID FROM CHAINED_ROWS
         WHERE TABLE_NAME=‘<table name>‘);

    C) Insert the rows back to the table.

       INSERT INTO <table name> SELECT * FROM <temporary table name>;

    Truncate the chained_rows table and drop the temporary table.

Alternatively, you can move the table to a tablespace if the row cannot fit in the block and you need a tablespace with a larger block size:
   alter table <table_name> move <tablespace>;

Note:
Check the SQL Reference guide for your release, for details on the ‘alter table..move..‘ command.

消除行链接、行迁移

时间: 2024-11-05 11:47:13

消除行链接、行迁移的相关文章

Oracle行迁移和行链接

行迁移和行链接都会导致Oracle性能下降,这篇文章将介绍什么是行迁移和行链接,它们带来的问题,如何来判断它们,并提供了解决它们的办法. 什么是行迁移和行链接 行迁移 Oracle的数据块会保留部分空间供以后更新使用,通常的数据块结构如下: PCTFREE定义一个块保留的空间百分比,默认是10,表示当数据块的可用空间低于10%后,就不可以被insert了,只能被update(具体看下面的PCTFREE介绍). 当一条记录被更新时,数据库引擎首先会尝试在它保存的数据块中寻找足够的空闲空间,如果没有

消除行链接

行链接 当第一次插入行时,由于行太长而不能容纳在一个数据块中时,就会发生行链接.在这种情况下,oracle会使用与该块链接的一块或多块数据块来容纳该行的数据.行连接经常在插入比较大的行时才会发生,如包含long, long row, lob等类型的数据.在这些情况下行链接是不可避免的. 行迁移 当修改不是行链接的行时,当修改后的行长度大于修改前的行长度,并且该数据块中的空闲空间已经比较小而不能完全容纳该行的数据时,就会发生行迁移.在这种情况下,Oracle会将整行的数据迁移到一个新的数据块上,而

ORACLE 行迁移和行链接

1. 行迁移 当发出update导致记录行长增加,block的剩余空间不足以存放这条记录,就会产生行迁移,发生行迁移时rowid不会改变,原来的block 中会用一个指针存放这条记录在新的block中的地址,发生行迁移会对性能产生影响,因为读这条记录会读两个BLOCK. 行迁移:导致应用需要访问更多的数据块,性能下降. 预防行迁移:1. 将数据块的PCTFREE调大:2. 针对表空间扩大数据块大小 消除行迁移的办法: 创建行迁移表,$ORACLE_HOME/rdbms/admin目录下的utlc

模拟Oracle行迁移和行链接

行链接消除方法创建大的block块------------------ 参考tom kyte的例子----------------------------------------------创建4k blocksize的表空间SQL> alter system set db_4k_cache_size=1m scope=both; System altered.SQL> create tablespace tbs1 datafile '/u01/app/oracle/oradata/test/

Oracle 行链接(Row chaining) 与行迁移(Row Migration)

场景:如果VarChar和VarChar2更经常修改,且修改的数据长度每次都不一样,这会引起“行迁移”现象 概念: 行链接(Row chaining) 与行迁移(Row Migration)当一行的数据过长而不能插入一个单个数据块中时,可能发生两种事情:行链接(row chaining)或行迁移(row migration). 行链接当第一次插入行时,由于行太长而不能容纳在一个数据块中时,就会发生行链接.在这种情况下,oracle会使用与该块链接的一块或多块数据块来容纳该行的数据.行连接经常在插

通过段调优顾问帮助解决行链接问题

--解决行链接问题 SQL> create tablespace hzqtbs datafile '/u01/app/oracle/oradata/prod/hzqtbs.dbf' size 600m; Tablespace created. SQL> create user hzq identified by hzq default tablespace hzqtbs quota unlimited on hzqtbs account unlock; User created. SQL>

2.1.5基础之命令行链接ftp dos中的ftp上传下载文件

Windows命令行batcmd脚本的应用之自动备份 异地备份2.1.5基础之命令行链接ftp dos中的ftp上传下载文件 讲解环境 VMware Workstation 12 桌面虚拟计算机软件创建虚拟机安装操作系统:http://edu.51cto.com/course/10007.html PC1:192.168.1.201 远程地址:192.168.100.100:2001 windows service2008 pc1 Admin111FTP虚拟用户 fileaa fileaaPC2

Python 逻辑行/物理行

物理行是你在编写程序时所看见的. 逻辑行是Python看见的单个语句.Python假定每个物理行对应一个逻辑行 . 默认地,Python希望每行都只使用一个语句,这样使得代码更加易读. 如果你想要在一个物理行中使用多于一个逻辑行,那么你需要使用分号(;)来特别地标明这种用法.分号表示一个逻辑行/语句的结束. 例如: i = 5 print i 与下面这个相同: i = 5; print i; 同样也可以写成: i = 5; print i; 甚至可以写成: i = 5; print i 然而,我

linux中vi复制与粘贴(整行,多行)

vi编辑器中的整行(多行)复制与粘贴就非常必要了. 1.复制 1)单行复制 在命令模式下,将光标移动到将要复制的行处,按“yy”进行复制: 2)多行复制 在命令模式下,将光标移动到将要复制的首行处,按“nyy”复制n行:其中n为1.2.3…… 2.粘贴 在命令模式下,将光标移动到将要粘贴的行处,按“p”进行粘贴 vi复制多行文本的方法方法1:光标放到第6行,输入:2yy光标放到第9行,输入:p此方法适合复制少量行文本的情况,复制第6行(包括)下面的2行数据,放到第9行下面.方法2:命令行模式下输