`

oracle 行链接与行迁移

阅读更多
表里的一行对于一个数据块太大的情况有二种(一行在一个数据块里放不下)

第一种情况:
INSERT的时候,INSERT时候行的大小就超一个块的大小。Oracle把这行的数据存储在一连串的数据块里(Oracle Stores the data for the row in a chain of data blocks),这种情况称为行链接(Row Chain),一般不可避免(除非使用更大的数据块)。

第二种情况:
UPDATE的时候,UPDATE之后导致行的大小超过一个块的大小,Oracle将迁移这行数据(整行)到一个新的数据块(假设更新的行在新的数据块下放得下,否则这里发生一次行链接),在行迁移之前的地方有一个指向迁移后数据块的指针,行的rowid不会改变。

view source
-- 行链接
SQL> create table t01
  2  (
  3     col01 varchar2(4000),
  4     col02 varchar2(4000),
  5     col03 varchar2(2000)
  6  )
  7  /

Table created.

SQL> insert into t01 values(lpad('*',4000,'*'),lpad('*',4000,'*'),lpad('*',2000,'*'));

1 row created.

SQL> commit;

Commit complete.

SQL> select rowid from t01;

ROWID
------------------
AAASpTAAEAAAALdAAA

SQL> select * from t01 where rowid='AAASpTAAEAAAALdAAA';

Execution Plan
----------------------------------------------------------
Plan hash value: 2326159110

-----------------------------------------------------------------------------------
| Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |      |     1 |  5018 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY USER ROWID| T01  |     1 |  5018 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          2  consistent gets
          0  physical reads

-- 行迁移
SQL> show parameter block_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     8192

SQL> create table t01
  2  (
  3     col01 varchar2(4000),
  4     col02 varchar2(4000),
  5     col03 varchar2(2000)
  6  )
  7  /

Table created.

SQL> insert into t01
  2    values(lpad('*',3000,'*'),lpad('*',3000,'*'),lpad('*',1000,'*'));

1 row created.

SQL> insert into t01
  2    values('a','a','a');

1 row created.

SQL> commit;

Commit complete.

SQL> select rowid from t01 where col01='a';

ROWID
------------------
AAASpWAAEAAAALrAAB

SQL> select * from t01 where rowid='AAASpWAAEAAAALrAAB';

Execution Plan
----------------------------------------------------------
Plan hash value: 2326159110

-----------------------------------------------------------------------------------
| Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |      |     1 |  5018 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY USER ROWID| T01  |     1 |  5018 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          1  consistent gets
          0  physical reads

SQL> update t01
  2     set col01 = lpad(col01, 3000, 'a'),
  3         col02 = lpad(col02, 3000, 'a'),
  4         col03 = lpad(col03, 1000, 'a')
  5    where col01 = 'a';

1 row updated.

SQL> commit;

Commit complete.

SQL> select rowid from t01 where col01 like 'a%';

ROWID
------------------
AAASpWAAEAAAALrAAB

SQL> select rowid from t01 where col01 like 'a%';

ROWID
------------------
AAASpWAAEAAAALrAAB

SQL> set autot trace
SQL> select * from t01 where rowid='AAASpWAAEAAAALrAAB';

Execution Plan
----------------------------------------------------------
Plan hash value: 2326159110

-----------------------------------------------------------------------------------
| Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |      |     1 |  5018 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY USER ROWID| T01  |     1 |  5018 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          2  consistent gets
          0  physical reads

-- 检查行迁移的记录
SQL> truncate table chained_rows;

Table truncated.

SQL> analyze table t01 list chained rows into chained_rows;

Table analyzed.

SQL> exec print_table('select * from chained_rows')
OWNER_NAME                    : YAO
TABLE_NAME                    : T01
CLUSTER_NAME                  :
PARTITION_NAME                :
SUBPARTITION_NAME             : N/A
HEAD_ROWID                    : AAASpWAAEAAAALrAAB
ANALYZE_TIMESTAMP             : 2012-12-24 11:31:51
-----------------

PL/SQL procedure successfully completed.

-- 消除行迁移

SQL> alter table t01 move;

Table altered.

SQL> select rowid from t01 where col01 like 'a%';

ROWID
------------------
AAASpZAAEAAAAL8AAA

SQL> set autot trace

SQL> select * from t01 where rowid='AAASpZAAEAAAAL8AAA';

Execution Plan
----------------------------------------------------------
Plan hash value: 2326159110

-----------------------------------------------------------------------------------
| Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |      |     1 |  5018 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY USER ROWID| T01  |     1 |  5018 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          1  consistent gets
          0  physical reads
分享到:
评论

相关推荐

    oracle_行链接和行迁移

    oracle_行链接和行迁移,详细介绍了oracle的行链接和行迁移。

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

    当一条记录被更新的时候,数据库引擎首先会尝试在它保存的数据块中寻找足够的空闲空间,如果没有足够的空闲空间可用,这条记录将被...第二部分包含所有的具体数据,将保存到另外一个新的数据块中,这个就成了行迁移。

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

    在实际的工作中我们经常会碰到一些Oracle数据库性能较低的问题,...通过合理的诊断行迁移/行链接,我们可以较大幅度上提高Oracle数 据库的性能。那究竟什么是行迁移/行链接呢,本文我们从Oracle的block开始为大家讲解。

    Oracle中行迁移和行链接的清除及检测

    在实际的工作中我们经常会碰到一些Oracle数据库性能较低的问题,当然,引起 Oracle数据库性能较低的原因是多方面的,我们能够通过一些...通过合理的诊断行迁移和行链接,我们可以较大幅度上提高Oracle数据库的性能。

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

    本文档详细描述了Oracle数据库中行迁移、行链接的问题:包括概念、原理、产生原因、以及解决方案。

    SQLServei迁移Oracle工具

    程序是C#写的,编译成64bit程序,只能跑在windows 64位平台,无需安装Oracle客户端,实现SQLServer2005以上数据 迁移数据到Oracle数据库 自动创建表及主键,自动迁移数据 使用方法: 1. 修改配置文件MigrationMSSQL2...

    Mysql迁移Oracle方案

    2.2 Oracle SQL Developer配置连接 2.2.1 连接本机mysql数据库 2.2.2 连接生产oracle数据库 2.3 执行迁移 2.3.1 关联移植资料档案库 2.3.2 捕获方案 2.3.3 设置数据映射 2.3.4 转换为oracle模型 2.3.5 生成数据结构...

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

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

    SSMA6.0(oracle迁移到sqlserver)

    oracle资料库资料迁移到MS-sql(sqlserver)工具,版本为6.0 如果连oracle资料库提示以下错误时, Unable to find specified provider. Error occurred while establishing connection to Oracle server. You might ...

    oracle迁移SQL server数据库迁移

    从oracle数据库迁移至SQLserver数据库,官方工具好用

    oracle 数据库 迁移 mysql

    Oracle到MySQL转换器是将数据库从Oracle迁移到MySQL服务器的工具。由于直接连接到源数据库和目标数据库,该程序保证了转换过程的高性能。它不使用ODBC或任何其他中间件组件。不需要安装Oracle组件。安装包包括产品到...

    Oracle-使用RMAN从10g直接迁移到11G

    Oracle-使用RMAN-将-DB-从10g-直接-Restore-到11g-示例

    SqlServer迁移至oracle所需jtds

    sqldeveloper里,选择工具→首选项→数据库→第三方JDBC驱动程序,选择该文件夹里的.jar,可进行迁移。

    行链接和行迁移的秘密

    本文主要描述的是:什么是行迁移与行链接如何判断行迁移与行链接如何避免行迁移与行链接当使用索引读取单行时,行迁移影响OLTP系统。最糟糕的情形是,对所有读取操作而言,增加了额外的I/O。行链接则影响索引读和全...

    从SQLServer迁移大批量数据到Oracle

    详细介绍了从SQL Server迁移大批量数据到Oracle的方法和具体的操作步骤。

    Mysql转Oracle软件 DBMover for Mysql to Oracle

    可以同时连接Mysql和Oracle,直接将数据导入Oracle。也可以保存数据到Dump文件。 功能完善的错误处理机制。记录每一条有异常的数据。并提供工具重复执行。 全面优化数据库操作,让大数据量的处理更少等待。

    oracle数据迁移到mysql小工具

    oracle数据迁移到mysql小工具,方便连接两个系统进行数据迁移。

    数据库迁移之从oracle 到 MySQL

    NULL 博文链接:https://zhaoshijie.iteye.com/blog/2201241

    Oracle 数据库Storage存储迁移笔记

    NULL 博文链接:https://wuhuizhong.iteye.com/blog/2170503

    oracle数据导入到Mysq库

    此工具功能是将oracle数据库中的数据迁移到mysql数据库,可以直接连接到两个目标数据库进行热操作,也可以读取oracle导出文件,导入的Mysql库中。

Global site tag (gtag.js) - Google Analytics