- 浏览: 772651 次
- 性别:
- 来自: 广州
文章分类
最新评论
表里的一行对于一个数据块太大的情况有二种(一行在一个数据块里放不下)
第一种情况:
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
第一种情况:
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 10g 的clusterware 32位 下载地址
2013-04-19 23:03 1166Oracle 10g 的clusterware 32位 下载地 ... -
oracle 分析函数 RANK()
2013-04-11 00:05 1068RANK()既是一个聚合函数,也是一个分析函数 其具体的语法 ... -
oracle 分析函数
2013-04-09 23:25 1140分析函数是用于计算一组中多行的聚合值,与聚合函数的区别在于聚合 ... -
批量执行 bulk collect与forall用法
2013-04-08 23:49 1343BULK COLLECT 子句会批量检 ... -
pl/sql集合类型
2013-03-26 10:12 1545--集合类型 /* 单行单列的数据,使用标量变量 单行 ... -
oracle Health Monitor
2013-01-20 00:02 1576About Health Monitor Beginning ... -
oracle moving window size与 AWR retention period关系
2013-01-19 15:58 8458转自: http://tomszrp.itpub.net/po ... -
Oracle11.2新特性之INSERT提示IGNORE_ROW_ON_DUPKEY_INDEX
2013-01-12 00:20 2838insert提示IGNORE_ROW_ON_DUPKEY_IN ... -
oracle 11g新特性Flashback data archive
2013-01-09 22:52 30461. 什么是flashback data archive F ... -
RMAN List和report 命令
2012-12-25 00:07 2832LIST 命令 使用RMAN LIST 命令显示有关资料档案库 ... -
oracle ASM中ASM_POWER_LIMIT参数
2012-12-24 23:46 6374ASM_POWER_LIMIT 该初始化参数用于指定ASM例程 ... -
oracle I/O 从属进程
2012-12-24 23:24 1374I/O 从属进程 I/O从 ... -
easy connect 之 ORA-12154: TNS: 无法解析指定的连接标识符
2012-12-19 23:43 5594用easy connect连接出现“tns无法解析指定的连接标 ... -
Flashback Database --闪回数据库
2012-12-19 23:38 1339Flashback 技术是以Undo segment中的内容为 ... -
Oracle 11g新特性:Automatic Diagnostic Repository
2012-12-19 22:35 1351Oracle Database 11g的FDI(Fault D ... -
RMAN配置中通道(CHANNEL)相关参数 PARALLELISM 、FILESPERSET的关系
2012-12-19 22:09 2598RMAN配置中通道(CHANNEL)相 ... -
oracle 空间RESUMABLE
2012-12-14 22:05 3011空间RESUMABLE操作 转 Oracle从9i开始 ... -
oracle 创建视图 with check option
2012-12-13 23:14 1466我们来看下面的例子: create or replace vi ... -
flashback transaction闪回事务查询
2012-11-26 22:00 1468闪回事务查询有别于闪回查询的特点有以下3个: (1) ... -
pl/sql连不上oracle数据库
2012-11-21 22:56 3712pl/sql 9.2版本连不上oracle数据库 当系统安装 ...
相关推荐
oracle_行链接和行迁移,详细介绍了oracle的行链接和行迁移。
当一条记录被更新的时候,数据库引擎首先会尝试在它保存的数据块中寻找足够的空闲空间,如果没有足够的空闲空间可用,这条记录将被...第二部分包含所有的具体数据,将保存到另外一个新的数据块中,这个就成了行迁移。
在实际的工作中我们经常会碰到一些Oracle数据库性能较低的问题,...通过合理的诊断行迁移/行链接,我们可以较大幅度上提高Oracle数 据库的性能。那究竟什么是行迁移/行链接呢,本文我们从Oracle的block开始为大家讲解。
在实际的工作中我们经常会碰到一些Oracle数据库性能较低的问题,当然,引起 Oracle数据库性能较低的原因是多方面的,我们能够通过一些...通过合理的诊断行迁移和行链接,我们可以较大幅度上提高Oracle数据库的性能。
本文档详细描述了Oracle数据库中行迁移、行链接的问题:包括概念、原理、产生原因、以及解决方案。
程序是C#写的,编译成64bit程序,只能跑在windows 64位平台,无需安装Oracle客户端,实现SQLServer2005以上数据 迁移数据到Oracle数据库 自动创建表及主键,自动迁移数据 使用方法: 1. 修改配置文件MigrationMSSQL2...
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
oracle资料库资料迁移到MS-sql(sqlserver)工具,版本为6.0 如果连oracle资料库提示以下错误时, Unable to find specified provider. Error occurred while establishing connection to Oracle server. You might ...
从oracle数据库迁移至SQLserver数据库,官方工具好用
Oracle到MySQL转换器是将数据库从Oracle迁移到MySQL服务器的工具。由于直接连接到源数据库和目标数据库,该程序保证了转换过程的高性能。它不使用ODBC或任何其他中间件组件。不需要安装Oracle组件。安装包包括产品到...
Oracle-使用RMAN-将-DB-从10g-直接-Restore-到11g-示例
sqldeveloper里,选择工具→首选项→数据库→第三方JDBC驱动程序,选择该文件夹里的.jar,可进行迁移。
本文主要描述的是:什么是行迁移与行链接如何判断行迁移与行链接如何避免行迁移与行链接当使用索引读取单行时,行迁移影响OLTP系统。最糟糕的情形是,对所有读取操作而言,增加了额外的I/O。行链接则影响索引读和全...
详细介绍了从SQL Server迁移大批量数据到Oracle的方法和具体的操作步骤。
可以同时连接Mysql和Oracle,直接将数据导入Oracle。也可以保存数据到Dump文件。 功能完善的错误处理机制。记录每一条有异常的数据。并提供工具重复执行。 全面优化数据库操作,让大数据量的处理更少等待。
oracle数据迁移到mysql小工具,方便连接两个系统进行数据迁移。
NULL 博文链接:https://zhaoshijie.iteye.com/blog/2201241
NULL 博文链接:https://wuhuizhong.iteye.com/blog/2170503
此工具功能是将oracle数据库中的数据迁移到mysql数据库,可以直接连接到两个目标数据库进行热操作,也可以读取oracle导出文件,导入的Mysql库中。