`

转:Oracle行迁移和行链接

 
阅读更多

行迁移和行链接都会导致Oracle性能下降,这篇文章将介绍什么是行迁移和行链接,它们带来的问题,如何来判断它们,并提供了解决它们的办法。

 

什么是行迁移和行链接

行迁移

Oracle的数据块会保留部分空间供以后更新使用,通常的数据块结构如下:

 

 

 

PCTFREE定义一个块保留的空间百分比,默认是10,表示当数据块的可用空间低于10%后,就不可以被insert了,只能被update(具体看下面的PCTFREE介绍)。

当一条记录被更新时,数据库引擎首先会尝试在它保存的数据块中寻找足够的空闲空间,如果没有足够的空闲空间可用,这条记录将被拆分为两个部分,第一个部分进包括指向第二个部分的rowid,该部分任然保留在原来的数据块中,第二个部分包含所有的具体数据,将保存到另外一个新的数据块中,这个就成为行迁移。

 

 

 

为什么不将整行都放到新的数据块中?

原因是这样会导致该行数据rowid发生变化,而rowid被存储在索引中,也有可能被客户端临时保存在内存中,rowid的变化可能导致查询错误。

 

PCTFREE介绍

 

PCTFREE可以在建表的时候指定:

 

create table test1 pctfree 20 as select rownum as id from all_objects where rownum <= 1000;

这里指定表test1的PCTFREE为20,通过下面的方式可以查看该值:

 

select table_name, pct_free from user_tables where table_name = 'TEST1';

 

TABLE_NAMEPCT_FREE

---------------------------

TEST120

在创建了表格后你可以通过alter table来调整PCTFREE值:

 

alter table test1 pctfree 15;

行链接

行链接和行迁移不同,行链接是当一条记录太大,在一个数据块中无法存入,这时会被拆分为2个或以上的部分,存储在多个块中,这多个块之间会构造一个链,如下:

 

 

 

行迁移是由于更新导致的,而行链接的原因则可能为:

 1)直接插入大的记录;

 2)更新记录导致记录大于一个数据块,在这时,这样记录可能会同时变为行迁移和行链接。

 

行迁移和行链接带来的问题

行迁移不会影响全扫描(全扫描更多介绍请看“Oracle性能分析4:数据访问方法之全扫描”),因为第一个部分不包含数据,会被直接跳过;但对于通过rowid进行访问(索引扫描或者直接使用rowid查询),则开销会翻倍,主要由于一次读取需要访问两个块。

行链接则和数据访问方式无关,每次访问到第一个记录片段之后,都需要通过rowid去访问其他的记录片段。

行迁移和行链接也会影响行级锁,因为每个记录片段都需要持有锁,锁的开销和记录片段的个数的增长成正比。

 

确定行迁移和行链接

确定行迁移和行链接可以使用下面几种方法。

 

查看v$sysstat和v$sesstat视图

该视图中统计项table fetch continued row可以确认是否出现了行迁移和行链接。

 

select name,value from v$sysstat where name = 'table fetch continued row';

 

NAMEVALUE

-----------------------------------------------

table fetch continued row27455

但这个值只能提示你数据库的某个地方存在行迁移或者行链接,如果要评估导致的影响,你需要和table scan rows gotten和table fetch by rowid的统计信息对比。

 

查看具体表的行迁移和行链接信息

对指定表执行:

 

analyze table <table_name> list chained rows

如果发现了行链接或者行迁移的记录,它们的rowid就会被记录到CHAINED_ROWS这张表中,该表可以使用$ORACLE_HOME/rdbms/admin目录下的UTLCHAIN.SQL或UTLCHN1.SQL脚本创建,建表语句如下:

 

create table CHAINED_ROWS (

  owner_name         varchar2(30),

  table_name         varchar2(30),

  cluster_name       varchar2(30),

  partition_name     varchar2(30),

  subpartition_name  varchar2(30),

  head_rowid         urowid,

  analyze_timestamp  date

);

下面的存储过程将可以用来分析符合条件的所有表:

 

begin

  for obj in (select owner, object_name

                from dba_objects

               where object_type = 'TABLE'

                 and <other conditions>) loop

    dbms_output.put_line(obj.owner || '.' || obj.object_name);

    execute immediate 'analyze table ' || obj.owner || '.' ||

                      obj.object_name || ' list chained rows';

  end loop;

end;

然后通过查看CHAINED_ROWS表中的数据发现哪些表中存在行迁移和行链接:

 

select table_name,head_rowid from CHAINED_ROWS

 

TABLE_NAMEHEAD_ROWID

--------------------------------------

IND$AAAAACAABAAAAAdAAA

IND$AAAAACAABAAAAAdAAG

IND$AAAAACAABAAAAAmAAI

IND$AAAAACAABAAAGpRAAH

IND$AAAAACAABAAAN0lAAD

IND$AAAAACAABAAAN0oAAE

......

在这里我们可以看到那些表的那些行存在行迁移和行链接,但并不知道具体是行迁移和行链接,我们可以通过计算记录的长度,再将该长度和块大小进行比较,从而识别出他们具体是行迁移还是行链接。

计算一行的长度使用下面的语句:

 

select vsize(<col1>) + vsize(<col2>) + ... + vsize(<col3>) from <table> where rowid = '<rowid>';

数据库的块大小在参数db_block_size中保存,参看参数的方法详见“Oracle参数查看方法小结”。

 

表统计信息中查看行迁移和行链接

表DBA_tables的chain_cnt字段表示行迁移和行链接的数量信息,但dbms_stats包不会收集这个统计信息,该值始终为0。

 

select table_name,chain_cnt from dba_tables where table_name = 'IND$';

 

TABLE_NAMECHAIN_CNT

---------------------------

IND$0

通过下面的SQL语句可以收集该信息:

 

analyze table ind$ compute statistics;

然后再次查看:

 

select table_name,chain_cnt from dba_tables where table_name = 'IND$';

 

TABLE_NAMECHAIN_CNT

---------------------------

IND$13

但该方法会导致被分析表的所有对象的统计信息都被覆盖,因此,在实践中不推荐使用。

 

解决办法

行迁移和行链接的解决办法不同,因此在处理前一定要区分清楚是行迁移还是行链接。

 

行迁移

首先我们应该避免行迁移,方法是在原块中保留足够的空闲空间,即调整PCTFREE参数值,值的大小需要评估记录扩展的平均大小。

当出现了行迁移后,则只能通过移动数据来解决,具体的方式有:

 1)通过导出、导入或者ALTER TABLE MOVE对表进行重整;

 2)将迁移的数据复制到临时表中,在原表上删除再重新插入这些数据。

 

行链接

处理行链接只能增加数据块的大小,但在一些情况下,可以通过将常用字段放在表的前面,不常访问的字段放在表的末尾来提高某些查询的效率(由于Oracle查询时只会取查询相关的字段)。

--------------------- 

作者:tomato__ 

来源:CSDN 

原文:https://blog.csdn.net/tomato__/article/details/40146573 

版权声明:本文为博主原创文章,转载请附上博文链接!

分享到:
评论

相关推荐

    oracle_行链接和行迁移

    以下是一个简单的示例,用以说明行迁移和行链接: ```sql -- 示例:创建一个包含长文本字段的表 CREATE TABLE test_table ( id NUMBER, long_column CLOB ); -- 插入一条长数据 INSERT INTO test_table (id, ...

    Oracle 行迁移与行链接的实验详解

    行迁移与行链接是Oracle数据库中常见的问题,通过合理的配置调整和表结构调整可以有效减少这些问题的发生,从而提升数据库的整体性能。对于已经发生的行迁移或行链接,可以采取上述解决措施进行优化。

    Oracle数据库中行迁移、行链接的问题

    在Oracle数据库中,行迁移(Row Migration)和行链接(Row Chaining)是两种与数据存储和空间管理紧密相关的现象。这两个概念对于理解和优化数据库性能至关重要。 行迁移是指当一个数据库行在一个分配的块中无法...

    Oracle8i行链接和行迁移探析.pdf

    《Oracle8i行链接和行迁移探析》这篇文章主要探讨了Oracle数据库中行迁移和行链接的概念、影响以及如何识别和处理这两种现象。行迁移和行链接是Oracle数据库在处理数据更新时可能出现的问题,对数据库性能产生显著...

    Oracle19c 数据库中行链接与行迁移详解及案例

    内容概要:本文详细介绍了 Oracle19c 数据库中的行链接和行迁移概念,解释了 PCTFREE 和 PCTUSED 参数的作用及其对数据块空间管理的影响。通过具体的示例,说明了行链接和行迁移的发生条件和解决方法。并提供了实际...

    oracle数据迁移

    其次,数据泵是Oracle的新一代数据迁移工具,它比传统的Export和Import工具更快,因为它使用了专有API绕过SQL缓冲区,支持更高效的提取和插入。数据泵可以导出和导入特定对象,并且可以被作业控制,允许暂停、重启或...

    从SQLServer迁移大批量数据到Oracle

    通过对 SQL Server 到 Oracle 的大批量数据迁移过程的详细分析,我们可以看出,合理利用 Microsoft DTS 和 Oracle Sqlload 工具能够显著提高数据迁移的效率。此外,通过适当的参数设置和优化策略,还可以进一步降低...

    Oracle数据库迁移相关技巧介绍

    本文将详细介绍Oracle数据库迁移过程中的一些实用技巧,帮助读者更好地理解和掌握Oracle数据库迁移的关键步骤。 #### 1. 强制日志记录 强制日志记录(Force Logging)是一种重要的机制,可以提高数据库的一致性和...

    Oracle11g冷备份并迁移整个数据库去另一台服务器.doc

    Oracle 11g冷备份并迁移整个数据库到另一台服务器 Oracle 11g冷备份是指在不停止数据库的前提下,对数据库进行备份的操作。cold backup是相对于hot backup的,hot backup是在数据库运行时进行备份,而cold backup是...

    Oracle跨平台迁移

    ### Oracle跨平台迁移知识点 #### 一、Oracle跨平台迁移概览 Oracle数据库跨平台迁移是指将现有的Oracle数据库从一个操作系统平台迁移到另一个操作系统平台上,同时也可能伴随着版本的升级。跨平台迁移通常需要...

    不安装oracle链接远程oracle

    总之,不安装Oracle也能通过各种绿色链接工具与远程Oracle数据库进行交互,这不仅降低了本地系统的资源需求,也为远程工作和协作提供了便利。在实际操作中,确保遵循最佳安全实践,比如使用安全的网络连接、定期更改...

    IBMDataMovementTool ,DB2-Oracle数据迁移工具

    6. **动态管道(Pipe)库**:Pipe64.dll和Pipe.dll可能包含了用于在不同进程间传输数据的动态链接库,这是实现高效数据迁移的关键组件。 7. **Java可执行文件**:IBMDataMovementTool.jar是基于Java的可执行文件,...

    Oracle数据库sql转换mysql数据库工具

    4. **权限与用户管理**:Oracle和MySQL的权限系统不同,工具可能能处理用户和权限的迁移。 5. **日志与跟踪**:在转换过程中,工具可能会记录日志,以便用户跟踪转换过程,定位和解决可能出现的问题。 6. **预览与...

    Oracle单机通过rman迁移到RAC集群.zip

    Oracle数据库是企业级广泛使用的数据库管理系统,而将一个Oracle单机环境迁移到RAC(Real Application Clusters,实时应用集群)集群,是为了提高系统的可用性和性能。RAC允许多个实例共享同一个物理数据库,从而...

    Oracle Data Integrator与OWB的集成及迁移

    标题和描述中提到的“Oracle Data Integrator与OWB的集成及迁移”是指Oracle提供了工具和方法,帮助现有的OWB用户将他们的工作迁移到ODI平台。这一过程涉及对OWB中已有的数据集成作业、映射和转换进行识别、转换和...

    jxl-2.6.10.rar odjbc14.jar : oracle导入导出Excel所需 jar包

    总之,"jxl-2.6.10.rar"和"odjbc14.jar"这两个jar包组合,为Java开发者提供了一个有效工具集,用于在Oracle数据库和Excel文件之间进行数据的导入和导出操作,从而提高数据处理的灵活性和效率。在实际项目中,根据...

Global site tag (gtag.js) - Google Analytics