返回顶部
首页 > 资讯 > 数据库 >行链接和行迁移
  • 452
分享到

行链接和行迁移

2024-04-02 19:04:59 452人浏览 八月长安
摘要

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

一、概述:
  如果你的oracle数据库性能低下,行链接和行迁移可能是其中的原因之一。我们能够通过合理的设计或调整数据库来阻止这个现象。
  
  行链接和行迁移是能够被避免的两个潜在性问题。我们可以通过合理的调整来提高数据库性能。本文主要描述的是:
    什么是行迁移与行链接
    如何判断行迁移与行链接
    如何避免行迁移与行链接

  当使用索引读取单行时,行迁移影响OLTP系统。最糟糕的情形是,对所有读取操作而言,增加了额外的I/O。行链接则影响索引读和全表扫描。
  
  注:在翻译行(row)时使用记录来描述(便于理解),如第一行,使用第一条记录。


二、Oralce 块
    操作系统块的大小是操作系统读写的最小操作单元,也是操作系统文件的属性之一。当创建一个数据库时,选择一个基于操作系统块的
  整数倍大小作为Oracle数据库块的大小。Oracle数据库读写操作则是以Oracle块为最小单位,而非操作系统块。一旦设置了Oracle数据块的大小,
  则在整个数据库生命期间不能被更改(除 Oracle 9i之外)。因此为Oracle数据库定制合理的Oralce块大小,象预期数据库总大小以及并发用户数这些
  因素应当予以考虑。  
  数据库块由下列逻辑结构(在整个数据库结构下)





 
  1. SELECT x,d,e FROM row_mig_chain_demo WHERE x = 3;


  2. SELECT a.name, b.value

  3. FROM v$statname a, v$mystat b

  4. WHERE a.statistiC# = b.statistic#

  5. AND lower(a.name) = 'table fetch continued row';


  6. NAME VALUE

  7. ---------------------------------------------------------------- ----------

  8. table fetch continued row 2



  9. --现在当我们通过主键索引扫描从记录3的尾部提取数据时,这将增加table fetch continued row的值。因为需要从行的头部和尾部获取数据来组合。


  10. --现在来看看全表扫描是否也有相同的影响。


  11. SELECT * FROM row_mig_chain_demo;


  12. X

  13. ----------

  14. 3

  15. 2

  16. 1


  17. SELECT a.name, b.value

  18. FROM v$statname a, v$mystat b

  19. WHERE a.statistic# = b.statistic#

  20. AND lower(a.name) = 'table fetch continued row';


  21. NAME VALUE

  22. ---------------------------------------------------------------- ----------

  23. table fetch continued row 3


  24. --此时table fetch continued row的值被增加,因为不得不对记录3的尾部进行融合。而记录1和2即便是存在迁移现象,但由于是全表扫描,

  25. --因此不会增加table fetch continued row的值。


  26. SELECT x,a FROM row_mig_chain_demo;


  27. X

  28. ----------

  29. 3

  30. 2

  31. 1


  32. SELECT a.name, b.value

  33. FROM v$statname a, v$mystat b

  34. WHERE a.statistic# = b.statistic#

  35. AND lower(a.name) = 'table fetch continued row';


  36. NAME VALUE

  37. ---------------------------------------------------------------- ----------

  38. table fetch continued row 3


  39. --当需要提取的数据是整个表上的头两列的时候,此时table fetch continued row也不会增加。因为不需要对记录3进行数据融合。


  40. SELECT x,e FROM row_mig_chain_demo;


  41. X

  42. ----------

  43. 3

  44. 2

  45. 1


  46. SELECT a.name, b.value

  47. FROM v$statname a, v$mystat b

  48. WHERE a.statistic# = b.statistic#

  49. AND lower(a.name) = 'table fetch continued row';


  50. NAME VALUE

  51. ---------------------------------------------------------------- ----------

  52. table fetch continued row 4


  53. --但是当提取列d和e的时候,table fetch continued row的值被增加。通常查询时容易产生行迁移即使是真正存在行链接,因为我们的查询

  54. --所需的列通常位于表的前几列。


八、如何鉴别行链接和行迁移




 
  1. --聚合统计所创建的表,这也将使得重构整行而发生table fetch continued row


  2. SELECT count(e) FROM row_mig_chain_demo;


  3. COUNT(E)

  4. ----------

  5. 1


  6. SELECT a.name, b.value

  7. FROM v$statname a, v$mystat b

  8. WHERE a.statistic# = b.statistic#

  9. AND lower(a.name) = 'table fetch continued row';


  10. NAME VALUE

  11. ---------------------------------------------------------------- ----------

  12. table fetch continued row 5



  13. --通过analyze table来校验表上的链接数


  14. ANALYZE TABLE row_mig_chain_demo COMPUTE STATISTICS;


  15. SELECT chain_cnt

  16. FROM user_tables

  17. WHERE table_name = 'ROW_MIG_CHAIN_DEMO';


  18. CHAIN_CNT

  19. ----------

  20. 3


  21. --3条记录是链接的。显然,他们中的两条记录是迁移(记录1,记录2)和一记录是链接(记录3).


  22. --实例启动后的table fetch continued row的总数


  23. --视图v$mystat告诉我们自从实例启动后,所有的表上共有多少次为table fetch continued row.


  24. sqlplus system/<passWord>


  25. SELECT 'Chained or Migrated Rows = '||value

  26. FROM v$sysstat

  27. WHERE name = 'table fetch continued row';


  28. Chained or Migrated Rows = 31637



  29. --上面的查询结果表明,可能有1个表上存在行链接被fetch了31637次,也可能有31637个表,每个表上有一个行链接,每次fetch一次。也有

  30. --可能是上述情况的组合。


  31. --31637次也许是好的,也许是坏的,仅仅是一个值而已。

  32. --这取决于

  33. --数据库启动了多久?

  34. --这个值占总提取数据百分比的多少行?

  35. --假如它占据了你从表上fetch的0.001%,则无关紧要。


  36. --因此,比较table fetch continued row与总提取的记录数是有必要的


  37. SELECT name,value FROM v$sysstat WHERE name like '%table%';


  38. NAME VALUE

  39. ---------------------------------------------------------------- ----------

  40. table scans (short tables) 124338

  41. table scans (long tables) 1485

  42. table scans (rowid ranges) 0

  43. table scans (cache partitions) 10

  44. table scans (direct read) 0

  45. table scan rows Gotten 20164484

  46. table scan blocks gotten 1658293

  47. table fetch by rowid 1883112

  48. table fetch continued row 31637

  49. table lookup prefetch client count 0


九、一个表上链接的行是多少? 




 
  1. --通过对表analyze后(未analyze是空值),可以从数据字典user_tales获得链接的记录数。

  2. ANALYZE TABLE row_mig_chain_demo COMPUTE STATISTICS;


  3. SELECT chain_cnt,

  4. round(chain_cnt/num_rows*100,2) pct_chained,

  5. avg_row_len, pct_free , pct_used

  6. FROM user_tables

  7. WHERE table_name = 'ROW_MIG_CHAIN_DEMO';


  8. CHAIN_CNT PCT_CHAINED AVG_ROW_LEN PCT_FREE PCT_USED

  9. ---------- ----------- ----------- ---------- ----------

  10. 3 100 3691 10 40


  11. --PCT_CHAINED 为100%,表明所有的行都是链接的或迁移的。


十、列出链接行

  当使用analyze table中的list chained rows子句能够列出一个表上的链接行。该命令的结果是将所有的链接上存储到一个由list chained rows子句
  显示指定的表中。 这些结构有助于决定是否将来有足够的空间实现行更新。
  
  创建CHAINED_ROWS 表
  创建一个用于存储analyze ... list chained rows命令结果的表,可以执行位于$ORACLE_HOME/rdbms/admin目录下的UTLCHAIN.SQL或UTLCHN1.SQL 脚本。
  这个脚本会在当前schema下创建一个名为chained_rows的表
    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         rowid,
      analyze_timestamp  date
    );

  当chained_rows表创建后,可以使用analyze table命令来指向该表作为输出。


十一、如何避免行链接和行迁移
      增加pctfree能够帮助避免行链接。如果我们为块留下更多的可用空间,则行上有空间满足将来的增长。也可以对那些有较高删除率的表采用重新组织
  或重建表索引来避免行链接与行迁移。如果表上有些行被频繁的删除,则数据块上会有更多的空闲空间。当被插入的行后续扩展,则被插入的行可能会
  分布到那些被删除的行上而仍然没有更多空间来用于扩展。重新组织表则确保主要的空闲空间是完整的空块。
  
      ALTER TABLE ... MOVE 命令允许对一个未分区或分区的表上的数据进行重新分配到一个新的段。也可以分配到一个有配额的不同的表空间。该命令也允许
  你在不能使用alter table的情形下来修改表或分区上的一些存储属性。也可以使用ALTER TABLE ... MOVE 命令中的compress关键字在存储到新段时使用压缩选项。 




 

[sql]   view plain   copy

  1. <code class="language-sql">1. ALTER TABLE MOVE      

  2.                                                                                    

  3. 使用alter table move 之前首先统计每个块上的行数.    

  4. SELECT dbms_rowid.rowid_block_number(rowid) "Block-Nr", count(*) "Rows"   

  5.   FROM row_mig_chain_demo                   

  6. GROUP BY dbms_rowid.rowid_block_number(rowid) order by 1;  

  7.                          

  8.  Block-Nr        Rows     

  9. ---------- ----------     

  10.       2066          3     

  11.                         

  12. --现在消除表上的行链接,使用alter table move来重建row_mig_chain_demo表到一个新段,指定一些新的存储选项。   

  13. ALTER TABLE row_mig_chain_demo MOVE   

  14.   PCTFREE 20         

  15.   PCTUSED 40        

  16.   STORAGE (INITIAL 20K   

  17.            NEXT 40K     

  18.            MINEXTENTS 2   

  19.            MAXEXTENTS 20   

  20.            PCTINCREASE 0);    

  21.          

  22. Table altered.    

  23.            

  24. --在alter table move之后再次统计每一块上的行数  

  25. SELECT dbms_rowid.rowid_block_number(rowid) "Block-Nr", count(*) "Rows"  

  26.   FROM row_mig_chain_demo      

  27. GROUP BY dbms_rowid.rowid_block_number(rowid) order by 1;   

  28.        

  29.  Block-Nr        Rows   

  30. ---------- ----------   

  31.       2322          1   

  32.       2324          1   

  33.       2325          1  

  34.     

  35. 2. 重建表上的索引  

  36. --移动一个表将使得表上记录的rowid发生变化。这将引起表上的索引被置为unusable状态。基于该表使用索引的DML语句将收到ORA-01502 错误。  

  37. --因此表上的索引必须被删除或重建。同样地,表上的统计信息也会变得无效。因此统计信息在表移动之后也应当重新收集。   

  38. ANALYZE TABLE row_mig_chain_demo COMPUTE STATISTICS;     

  39.                

  40. ERROR at line 1:    

  41. ORA-01502: index 'SCOTT.SYS_C003228' or partition of such index is in unusable state   

  42.                         

  43. --表上的主键必须被重建     

  44. ALTER INDEX SYS_C003228 REBUILD;    

  45. Index altered.      

  46.                

  47. ANALYZE TABLE row_mig_chain_demo COMPUTE STATISTICS;     

  48. Table analyzed.      

  49.        

  50. SELECT chain_cnt,        

  51.        round(chain_cnt/num_rows*100,2) pct_chained,   

  52.        avg_row_len, pct_free , pct_used    

  53.   FROM user_tables             

  54.  WHERE table_name = 'ROW_MIG_CHAIN_DEMO';     

  55.                         

  56.  CHAIN_CNT PCT_CHAINED AVG_ROW_LEN   PCT_FREE   PCT_USED    

  57. ---------- ----------- ----------- ---------- ----------   

  58.          1       33.33        3687         20         40      

  59. --如果表包含LOB 列,用户可以指定该命令连同LOB数据段以及LOB索引段(同该表相关)一起移动(move)。  

  60. --当未指定时,则LOB数据段以及LOB索引段不参与移动。  

  61. </code>  


十二、检测所有表上的行连接与行迁移

  可以通过CHAINED_ROWS 表获取所有表上的行链接与行迁移。  




 
  1. 1.创建chained_rows表

  2. cd $ORACLE_HOME/rdbms/admin

  3. sqlplus scott/tiger

  4. @utlchain.sql


  5. 2.ananlyze 所有表/或指定表

  6. SELECT 'ANALYZE TABLE '||table_name||' LIST CHAINED ROWS INTO CHAINED_ROWS;'

  7. FROM user_tables

  8. /


  9. ANALYZE TABLE ROW_MIG_CHAIN_DEMO LIST CHAINED ROWS INTO CHAINED_ROWS;

  10. ANALYZE TABLE DEPT LIST CHAINED ROWS INTO CHAINED_ROWS;

  11. ANALYZE TABLE EMP LIST CHAINED ROWS INTO CHAINED_ROWS;

  12. ANALYZE TABLE BONUS LIST CHAINED ROWS INTO CHAINED_ROWS;

  13. ANALYZE TABLE SALGRADE LIST CHAINED ROWS INTO CHAINED_ROWS;

  14. ANALYZE TABLE DUMMY LIST CHAINED ROWS INTO CHAINED_ROWS;


  15. Table analyzed.


  16. 3.查看行链接的rowid

  17. SELECT owner_name,

  18. table_name,

  19. count(head_rowid) row_count

  20. FROM chained_rows

  21. GROUP BY owner_name,table_name

  22. /


  23. OWNER_NAME TABLE_NAME ROW_COUNT

  24. ------------------------------ ------------------------------ ----------

  25. SCOTT ROW_MIG_CHAIN_DEMO 1

  通过该方式可以快速的定位一个表上有多少行链接问题的。如果行链接或行迁移较多,则应当基于该表增加pctfree的值 或重建该表。


十三、结论:
   行迁移影响OLTP系统使用索引读取单行。最糟糕的情形所对所有的读都增加额外的I/O。而行链接则影响索引读和全表扫描。
   行迁移通常由update操作引起
   行链接通常有insert操作引起
   基于行链接或行迁移的查询或创建(如索引)由于需要更多的I/O将降低数据库的性能
   调试行链接或行迁移使用analyze 命令,查询v$sysdate视图 
   移出行链接或行迁移使用更大的pctfree参数或使用alter table move命令


十四、关于作者

原文链接: The Secrets of Oracle Row Chaining and Migration

Martin Zahn, Akadia AG, InfORMation Technology, CH-3672 Oberdiessbach
EMail: martin dot zahn at akadia dot ch

12.09.2007: Updated for Oracle 10.2


您可能感兴趣的文档:

--结束END--

本文标题: 行链接和行迁移

本文链接: https://lsjlt.com/news/47054.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 行链接和行迁移
    一、概述:   如果你的Oracle数据库性能低下,行链接和行迁移可能是其中的原因之一。我们能够通过合理的设计或调整数据库来阻止这个现象。     ...
    99+
    2024-04-02
  • 什么是SQL行迁移和行链接
    本篇内容介绍了“什么是SQL行迁移和行链接”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!行迁移和行链接(行...
    99+
    2024-04-02
  • Oracle数据库中怎么实现数据行迁移与行链接
    本篇内容主要讲解“Oracle数据库中怎么实现数据行迁移与行链接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle数据库中怎么实现数据行迁移与行链接”吧...
    99+
    2024-04-02
  • PHP中如何进行迁移学习和模型迁移?
    随着机器学习在各个领域中的广泛应用,迁移学习和模型迁移已经成为了热门话题。在使用PHP进行机器学习时,如何进行迁移学习和模型迁移也成为了一个必须要考虑的问题。本文将介绍PHP中如何进行迁移学习和模型迁移,并提供一些实用的技巧和建议。什么是迁...
    99+
    2023-05-21
    迁移学习 PHP 模型迁移
  • 使用ODBC连接Oracle进行大数据迁移
    大数据迁移是一个复杂的过程,特别是当涉及到使用ODBC连接Oracle数据库时。以下是一些步骤和注意事项: 确保你已经安装了适当的ODBC驱动程序,以便连接Oracle数据库。你可以从Oracle官方网站下载适用于你的操作系统的驱动程序...
    99+
    2024-07-15
    oracle
  • SVN仓库怎么进行备份和迁移
    本文小编为大家详细介绍“SVN仓库怎么进行备份和迁移”,内容详细,步骤清晰,细节处理妥当,希望这篇“SVN仓库怎么进行备份和迁移”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。仓库备份svnadmin dump备份...
    99+
    2023-06-27
  • oracle怎么查看行动迁移
    oracle 提供了多种查看行动迁移的方法,包括 dba_migrations 视图、v$migrations 视图和迁移操作,如 dbms_migration.migrate_sche...
    99+
    2024-05-21
    oracle
  • 阿里云ECS迁移如何进行无缝对接与交接
    本文将详细介绍如何在阿里云ECS上进行无缝对接与交接,包括迁移过程中的注意事项,以及如何保证数据的安全性和完整性。 阿里云ECS(Elastic ComputeService)是阿里云推出的一种弹性计算服务,为用户提供计算、存储、网络、安全...
    99+
    2023-11-10
    阿里 ECS
  • 如何在GitLab中进行项目迁移和集成
    如何在GitLab中进行项目迁移和集成引言:在软件开发过程中,项目的迁移和集成是一项重要的任务。GitLab作为一个流行的代码托管平台,提供了一系列方便的工具和功能来支持项目迁移和集成。本文将介绍在GitLab中进行项目迁移和集成的具体步骤...
    99+
    2023-10-27
    集成 迁移 GitLab迁移:迁移 GitLab集成:集成 项目迁移和集成: 项目
  • 如何在MySQL中进行数据迁移和升级
    在MySQL中进行数据迁移和升级可以通过以下步骤完成: 备份数据:在进行数据迁移和升级之前,首先应该备份现有的数据以防止数据丢失...
    99+
    2024-03-06
    MySQL
  • MariaDB如何进行数据库迁移
    数据库迁移通常是指将数据从一个数据库服务器迁移到另一个数据库服务器,下面是使用MariaDB迁移数据库的一般步骤: 备份原始数据库...
    99+
    2024-04-02
  • SQLServer中怎么进行数据迁移
    在SQL Server中进行数据迁移可以通过多种方法实现,以下是一些常用的方法: 使用SQL Server自带的导入导出工具:S...
    99+
    2024-03-11
    SQLServer
  • oracle sqlprofile 固定执行计划,并迁移执行计划
    sqlprofile固定执行计划 模拟10g 执行计划迁移至11g oracle数据库中,11g库用10g的执行计划,这里是把hint 全盘扫描的执行计划迁移  --1.准备阶段&nb...
    99+
    2024-04-02
  • 如何在Mac之间进行数据迁移,macbook怎么迁移数据
    更换了新的Mac电脑,怎样把旧Mac里面的文件、应用程序和帐号信息等迁移到新Mac上?如何在Mac之间进行数据迁移。 一、mac电脑怎么迁移数据 mac电脑怎么迁移数据?据苹果官方消息得知,Mac里储存的文件资料、系统设置、帐户信息...
    99+
    2023-09-01
    macos windows microsoft
  • 如何在Teradata中执行数据迁移和ETL操作
    在Teradata中执行数据迁移和ETL操作通常可以通过以下几种方法: 使用Teradata的内置工具:Teradata提供了一...
    99+
    2024-04-09
    Teradata
  • 在Oracle中如何执行数据库升级和迁移
    在Oracle数据库中,执行数据库升级和迁移通常涉及以下步骤: 创建数据库备份:在进行升级或迁移之前,首先应该创建数据库的完整备...
    99+
    2024-04-09
    Oracle
  • 怎么进行scp用户的rsync迁移
    怎么进行scp用户的rsync迁移,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在 SSH 8.0 预发布公告中,OpenSSH 项目表示,他们认为 ...
    99+
    2023-06-15
  • 怎么使用dbeaver进行数据迁移
    要使用DBeaver进行数据迁移,你可以按照以下步骤操作: 打开DBeaver并连接到源数据库和目标数据库。 在DBeave...
    99+
    2024-03-14
    dbeaver
  • 在Torch中如何进行迁移学习
    在Torch中进行迁移学习通常涉及以下步骤: 加载预训练模型:通常使用已经在大规模数据集上预训练过的模型作为迁移学习的基础。可以使...
    99+
    2024-04-02
  • 如何在Cassandra中进行数据迁移和节点替换
    在Cassandra中进行数据迁移和节点替换可以通过以下步骤实现: 向新节点添加节点 首先,向集群中添加一个新节点,可以使用命令...
    99+
    2024-04-09
    Cassandra
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作