模拟Oracle行迁移和行链接
行链接
消除方法创建大的block块
------------------ 参考tom kyte的例子--------------------------------------------
--创建4k blocksize的表空间
SQL> alter system set db_4k_cache_size=1m scope=both;
System altered.
SQL> create tablespace tbs1 datafile '/u01/app/oracle/oradata/test/tbs_1.dbf' size 100m blocksize 4k;
Tablespace created.
--行链接测试
--使用定列宽的char类型来创建行链接测试表
SQL> create table row_chain_demo(
x int primary key,
a char(1000),
b char(1000),
c char(1000),
d char(1000)
) tablespace tbs1;
Table created.
--插入数据
SQL> insert into row_chain_demo(x,a,b,c,d) values(1,'a','b','c','d');
1 row created.
SQL> commit;
Commit complete
--分析测试表,检查行链接
--首先建chaind_rows相关表
SQL> @?/rdbms/admin/utlchain.sql
Table created.
--分析表
SQL> analyze table row_chain_demo list chained rows into chained_rows;
Table analyzed.
--查询行链接
SQL> select * from chained_rows where table_name='ROW_CHAIN_DEMO';
OWNER_NAME TABLE_NAME CLUSTER_NAME PARTITION_NAME SUBPARTITION_NAME HEAD_ROWID ANALYZE_T
------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------ ---------
SYS ROW_CHAIN_DEMO N/A AAAFytAAGAAAAEIAAA 20-AUG-18
记录下此时的执行计划:
SQL> set autotrace traceonly statistics
SQL> set linesize 100
SQL> select /*+index(ROW_CHAIN_DEMO,x)*/* from ROW_CHAIN_DEMO where x=1;
Statistics
----------------------------------------------------------
6 recursive calls
0 db block gets
13 consistent gets
0 physical reads
0 redo size
4815 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
--找出row_chain_demo这张表所对应的数据块
SQL> select dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block# from row_chain_demo;
FILE# BLOCK#
---------- ----------
6 264
--dump该数据块进行分析
SQL> alter system dump datafile 6 block 264;
System altered.
--以下为trace文件的内容
data_block_dump,data header at 0x7f28ca793264
===============
tsiz: 0xf98
hsiz: 0x14
pbl: 0x7f28ca793264
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xba1
avsp=0xb8d
tosp=0xb8d
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0xba1
block_row_dump:
tab 0, row 0, @0xba1
tl: 1015 fb: --H-F lb: 0x1 cc: 2
--正常的行记录为--H-FL--,而这里为只有F(fisrt)而没有L(last),说明在这个数据块中只有行的开始,而没有行的结束,同样cc为2说明这个块中只包含了表的两个列 */
nrid: 0x01c00105.0
-- nrid表示数据块的下一个指针,即其他列数据存放的数据块地址
--通过bbed分析
BBED> p kdbr
sb2 kdbr[0] @118 2977
BBED> p *kdbr[0]
rowdata[0]
----------
ub1 rowdata[0] @3077 0x28
BBED> x /rnccccccc
rowdata[0] @3077
----------
flag@3077: 0x28 (KDRHFF, KDRHFH)
lock@3078: 0x01
cols@3079: 2 --从这也可以看出数据块中只有表的两个列
nrid@3080:0x01c00105.0
col 0[2] @3086: 1
col 1[1000] @3089: a
--消除行链接
--创建blocksize为32的表空间,并将测试表移动到该表空间
SQL> alter system set db_32k_cache_size=1m scope=both;
System altered.
SQL> create tablespace tbs2 datafile '/u01/app/oracle/oradata/test/tbs2.dbf' size 100m blocksize 32k;
Tablespace created.
SQL> alter table row_chain_demo move tablespace tbs2;
Table altered.
SQL> select index_name from dba_indexes where table_name='ROW_CHAIN_DEMO';
INDEX_NAME
------------------------------
SYS_C0010231
SQL> alter index SYS_C0010231 rebuild;
Index altered.
--检查行链接
SQL> delete from chained_rows;
1 row deleted.
SQL> commit;
Commit complete.
SQL> analyze table ROW_CHAIN_DEMO list chained rows into chained_rows;
Table analyzed.
SQL> select * from chained_rows where table_name='CHAIN_ROW_DEMO';
no rows selected
--查看消除行链接后的执行计划状态
SQL> select /*+index(ROW_CHAIN_DEMO,x)*/* from ROW_CHAIN_DEMO where x=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
4668 bytes sent via SQL*Net to client
512 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)http://write.blog.csdn.net/postedit/52963389
1 rows processed
--可以看出只发生了两次一致性读
行迁移
消除方法,重建数据表
--创建测试表,保证表的字段能够大于blocksize
SQL> create table row_mig_demo(
x int primary key,
a char(1000),
b char(1000),
c char(1000),
d char(1000)
) tablespace tbs1;
Table created.
--插入数据,只插入一个字段的值
SQL> insert into row_mig_demo(x) values(1);
1 row created.
SQL> commit;
Commit complete.
--分析表,查看是否有行迁移情况(此时必然没有)
SQL> analyze table row_mig_demo list chained rows into chained_rows;
Table analyzed.
SQL> select * from chained_rows where table_name='ROW_MIG_DEMO';
no rows selected
--查看测试表所在的数据块
SQL> select dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block# from row_mig_demo;
FILE# BLOCK#
---------- ----------
6 279
--dump数据块查看
SQL> alter system dump datafile 6 block 279;
System altered.
--trace文件内容
data_block_dump,data header at 0x7fa1ea9e1864
===============
tsiz: 0xf98
hsiz: 0x14
pbl: 0x7fa1ea9e1864
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xf8c
avsp=0xf7b
tosp=0xf7b
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0xf8c
block_row_dump:
tab 0, row 0, @0xf8c
tl: 6 fb: --H-FL-- lb: 0x1 cc: 1 --FL:说明此时数据行的头和尾都在block内,cc:1,即只有一个字段的数据
col 0: [ 2] c1 02
end_of_block_dump
--通过bbed查看block数据层内容
BBED> p kdbr
sb2 kdbr[0] @118 3980
BBED> p *kdbr[0]
rowdata[0]
----------
ub1 rowdata[0] @4080 0x2c
BBED> x /rnccccccc
rowdata[0] @4080
----------
flag@4080: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@4081: 0x01
cols@4082: 1
col 0[2] @4083: 1
--此时的执行计划状态
SQL> select * from ROW_MIG_DEMO where x=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
639 bytes sent via SQL*Net to client
512 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
--update测试表,是表的行数据大于blocksize
SQL> update row_mig_demo set a='a',b='b',c='c',d='d' where x=1;
1 row updated.
SQL> commit;
Commit complete.
SQL> delete from chained_rows;
0 rows deleted.
SQL> commit;
Commit complete.
SQL> analyze table row_mig_demo list chained rows into chained_rows;
Table analyzed.
SQL> select * from chained_rows where table_name='ROW_MIG_DEMO';
OWNER_NAME TABLE_NAME
------------------------------ ------------------------------
CLUSTER_NAME PARTITION_NAME
------------------------------ ------------------------------
SUBPARTITION_NAME HEAD_ROWID ANALYZE_T
------------------------------ ------------------ ---------
SYS ROW_MIG_DEMO
N/A AAAVqrAAHAAAAEVAAA 29-OCT-16
--可以看到已经产生了行迁移
--dump数据块查看
SQL> select dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block# from row_mig_demo;
FILE# BLOCK#
---------- ----------
6 279 --表所在数据块地址并未改变
SQL> alter system dump datafile 6 block 279;
System altered.
--trace文件内容
data_block_dump,data header at 0x7f28ca793264
===============
tsiz: 0xf98
hsiz: 0x14
pbl: 0x7f28ca793264
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xba1
avsp=0xb8d
tosp=0xb8d
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0xba1
block_row_dump:
tab 0, row 0, @0xba1
tl: 1015 fb: --H-F--- lb: 0x1 cc: 2
nrid: 0x01c00105.0
col 0: [ 2] c1 02
col 1: [1000]
--bbed查看
BBED> p kdbr
sb2 kdbr[0] @118 2965
BBED> p *kdbr[0]
rowdata[0]
----------
ub1 rowdata[0] @3065 0x28
BBED> x /rnccccccc
rowdata[0] @3065
----------
flag@3065: 0x28 (KDRHFF, KDRHFH)
lock@3066: 0x02
cols@3067: 2
nrid@3068:0x01c00116.0
col 0[2] @3074: 1
col 1[1000] @3077: a
--消除行迁移
SQL> create table row_mig_demp1 as select * from row_mig_demo;
Table created
模拟Oracle行迁移和行链接的更多相关文章
- Oracle 行迁移和行链接
一.行迁移 1.1.行迁移概念 当一个行上的更新操作(原来的数据存在且没有减少)导致当前的数据不能在容纳在当前块,我们需要进行行迁移.一个行迁移意味着整行数据将会移动,仅仅保留的是一个转移地址.因此整 ...
- oracle 11g sql优化之行迁移处理(加大BLOCK块)
行链接 产生原因:当一行数据大于一个数据块,ORACLE会同时分配两个数据块,并在第一个块上登记第二个块的地址,从而形成行链接. 预防方法:针对表空间扩大数据块大小.检查:analyze table ...
- [20180327]行迁移与ITL浪费.txt
[20180327]行迁移与ITL浪费.txt --//生产系统遇到的一个问题,增加一个字段到表结构,修改数据字典,导致出现行迁移,而更加严重的是没有修改pctfree值,--//以后的业务操作,依旧 ...
- 【oracle11g,17】存储结构: 段的类型,数据块(行连接、行迁移,块头),段的管理方式,高水位线
一.段的类型: 1.什么是段:段是存储单元. 1.段的类型有: 表 分区表 簇表 索引 索引组织表(IOT表) 分区索引 暂时段 undo段 lob段(blob ,clob) 内嵌表(record类型 ...
- oracle 分组取第一行数据 ,查询sql语句
oracle 分组取第一行数据 SELECT * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC) rn, t.* FR ...
- Oracle JDK迁移指南
Oracle JDK迁移指南 https://docs.oracle.com/en/java/javase/11/migrate/index.html#JSMIG-GUID-C25E2B1D-6C24 ...
- Oracle数据迁移expdp/impdp
Oracle数据迁移expdp/impdp目的:指导项目侧自行进行简单的数据泵迁移工作. 本文实验环境:Oracle 11.2.0.4,利用数据库自带的scott示例用户进行试验测试. 1.首先需要创 ...
- Oracle 数据库迁移到MySQL (kettle,navicate,sql developer等工具
Oracle 数据库迁移到MySQL (kettle,navicate,sql developer等工具 1 kettle --第一次使用kettle玩迁移,有什么不足之处和建议,请大家指正和建议. ...
- Oracle 服务器迁移的一些经验
前言 通过此文章来分享一下 Oracle 服务器迁移过程中的一些经验,希望对大家有些许帮助. 本文旨在帮助更多的同学,会提及一些基本命令或技巧,但不赘述,后续有机会再进一步分享各个细节. 背景 之前因 ...
随机推荐
- 使用httpclient访问NLP应用接口例子
参考网址: http://yuzhinlp.com/docs.html 接入前须知 接入条件 1.进入网站首页,点击注册成为语知科技用户 2.注册完成后,系统将提供语知科技用户唯一标识APIKey,并 ...
- 编译linux内核前用make menuconfig设置时 Unable to find the ncurses ibraries的解决办法
今天在更新CentOS或者Ubuntu的内核时,执行make menuconfig可能看如这样的错误: *** Unable to find the ncurses libraries or the ...
- port bridge enable命令导致的环路
1.故障描述 前几天机房一台连接数据中心与核心交换的交换机宕机(硬件故障),机房有备用的设备,随即更换(配置也是早就配置好了的),但是下午就出现数据中心网络丢包问题,表现为存在mac漂移 2.拓扑 核 ...
- vue入门1(搭建项目)
安装node.js 安装cnpm npm install -g cnpm --registry=http://registry.npm.taobao.org 安装vue-cli脚手架构建工具 npm ...
- 我的 FPGA 学习历程(02)—— 实验:点亮 LED 灯
关于 Quartus 的操作可以使用 Quartus 自带的帮助,帮助中带有全套的操作教程. 中文网络教程链接(链接至 altera中文官网,点击观看) Quartus II 软件设计系列:基础 Qu ...
- JavaScript(五)
循环语句 程序中进行有规律的重复性操作,需要用到循环语句. for循环 for(var i=0;i<len;i++) { ...... } while循环 var i=0; while(i< ...
- 前端性能优化 —— 添加Expires头
简要:添加Expires头能有效的利用浏览器的缓存能力来改善页面的性能,能在后续的页面中有效避免很多不必要的Http请求,WEB服务器使用Expires头来告诉Web客户端它可以使用一个组件的当前副本 ...
- | 线段树-地平线horizon
[题目描述]:在地平线上有n个建筑物.每个建筑物在地平线上可以看成一个下边界和地平线重合的矩形.每个建筑物有三个描述(Li ,Ri,Hi),分别表示该建筑物的左边界,右边界,高度.输出输出这些建筑物在 ...
- 人工智能--AI篇
AI背景 在当今互联网信息高速发展的大背景下,人工智能(AI)已经开始走进了千家万户,逐渐和我们的生活接轨,那具体什么是AI呢? 什么是人工智能(AI)? 人工智能:简单理解就是由人制造出来的,有一定 ...
- 几何入门合集 gym101968 problem F. Mirror + gym102082 Problem F Fair Chocolate-Cutting + gym101915 problem B. Ali and Wi-Fi
abstract: V const & a 加速 F. Mirror 题意 链接 问题: 有n个人在y=0的平面上(及xoz平面).z=0平面上有一面镜子(边平行于坐标轴).z=a平面上有q个 ...