`

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数据库管理过程中,行迁移(row migration)与行链接(row chaining)是两种常见的现象,它们通常发生在记录过大或更新操作导致记录扩展超出单个数据块所能...

    oracle_行链接和行迁移

    - **与行迁移的区别**:行迁移是将整行数据移动到新的块中,而行链接是将一行数据分割并存储在多个块中。 #### 五、示例样本 以下是一个简单的示例,用以说明行迁移和行链接: ```sql -- 示例:创建一个包含长...

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

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

    记使用Oracle SQL Developer 迁移MySql 数据至 Oracle.docx

    此外,检查Oracle服务是否正常运行,特别是Oracle监听器和服务,它们是数据迁移的基础设施,如果未启动,将导致无法连接。 总结来说,从MySQL到Oracle的数据迁移是一个涉及多个步骤的过程,需要正确配置和管理...

    oracle向达梦数据库迁移

    在开始迁移之前,首要任务是在DM8中创建与Oracle数据库中的用户相对应的新用户。这一步不仅包括创建用户,还包括为用户分配相应的权限和角色,以确保迁移后系统功能的正常运行。 二、新建工程、迁移 创建一个迁移...

    SQLServei迁移Oracle工具

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

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

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

    数据迁移 说明 oracle 数据迁移完整手册

    该方法简单易行,类似于 MySQL 数据库迁移到 Oracle 数据库的过程。 二、实现步骤 1. 在目标数据库中创建表空间和用户 首先,需要在目标数据库中创建表空间和用户。对于 Oracle 数据库,不像 MySQL 中一个用户...

    Mysql迁移Oracle方案

    - **连接本机MySQL数据库**:通过Oracle SQL Developer的连接功能,建立与本地MySQL数据库的连接。 - **连接生产Oracle数据库**:同样地,也需要通过Oracle SQL Developer连接到生产Oracle数据库。 ##### 2.3 执行...

    oracle数据库迁移实例01

    ### Oracle数据库迁移实例01:Windows环境下通过镜像文件实现db_name与instance_name不一致的迁移 #### 环境概述 本案例介绍了一个特定场景下的Oracle数据库迁移过程,涉及的环境包括: - **源数据库**:Oracle 9.2...

    SQLSERVER到ORACLE的数据库迁移

    在进行数据迁移之前,首先需要了解SQL Server与Oracle之间不同类型的数据类型的映射关系。下面是两种数据库管理系统之间的主要数据类型对应关系: | SQL Server Data Type | Oracle Data Type | |-----------------...

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

    - **SCANIP**:作为客户端与数据库之间的连接层,需与PublicIP和VIP在同一网段。 **注1**:网卡eth0配置为PublicIP,eth1配置为PrivateIP。 **注2**:所有IP地址必须是可用的且未被占用。 ##### 3.5 ASM磁盘组规划...

    IBM Portal7.0数据库迁移oracle教程完全版

    ### IBM Portal 7.0 数据库迁移至 Oracle 完全教程 #### 一、数据库准备 **1.1 IBM Portal 7.0 兼容的 Oracle 版本及操作系统** IBM Portal 7.0 支持多种 Oracle 数据库版本及操作系统,确保在迁移过程中选择正确...

    Oracle至PostgreSQL数据库迁移方案.pptx

    它连接Oracle数据库,自动扫描并提取其结构或数据,然后生成可以加载到PostgreSQL数据库中的SQL脚本。 二、Ora2PG功能 Ora2PG可以支持大多数SQL的转换,但某些情况下仍需要人工校正语法,使其兼容PostgreSQL。其...

    C# 实现oracle数据库视图的迁移

    1. **建立数据库连接**:使用OracleConnection类创建连接字符串,并建立与源数据库和目标数据库的连接。连接字符串应包含数据库的服务器地址、服务名、用户名和密码等信息。 2. **获取源视图信息**:使用...

    ORACLE数据库冷备份方式迁移.pdf

    Oracle数据库的冷备份迁移是一种在数据库关闭状态下进行的迁移方法,主要涉及数据库文件的复制、参数文件的调整以及可能的版本升级。以下是对这个过程的详细解释: 首先,确保新服务器上安装的Oracle数据库版本与旧...

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

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

Global site tag (gtag.js) - Google Analytics