oracle判断数据出现交叉,Oracle move table分析

在move操作的时候,进行的是block之间的数据copy,所以table所位于的block的区域会发生变化;所有行物理存储的顺序不会发生变化,但行号会变成按AAA增1的顺子,所以block里行会挪紧,实现了消除HWM和行碎片(包括行迁移问题),但不会释放申请的空间(其他segment不能使用此部分的空闲空间,只能本segment增加数据时使用),得到了空闲空间但不释放,更说明是block之间的copy,只是block内行会挪紧。当前的tablespace中需要有1倍于table的空闲空间以供使用。所有行的rowid都发生了变化,index是通过rowid来fetch数据行的,所以,table上的index是必须要rebuild的。table在进行move操作时,table上加了exclusive lock,我们只能对它进行select的操作。反过来说,当我们的一个session对table进行DML操作且没有commit时,在另一个session中是不能对这个table进行move操作的,否则oracle会返回这样的错误信息:ORA-00054: 资源正忙,要求指定 NOWAIT。最后重新编译数据库所有失效的对象,收集新的table统计分析数据。

实验:

1.建表并插入数据:

SQL> create table sjh.test1(id int) tablespace users;

表已创建。

SQL> insert into sjh.test1 values(1);

已创建 1 行。

SQL> insert into sjh.test1 values(2);

已创建 1 行。

SQL> insert into sjh.test1 values(3);

已创建 1 行。

SQL> insert into sjh.test1 values(4);

已创建 1 行。

SQL> insert into sjh.test1 values(5);

已创建 1 行。

SQL> insert into sjh.test1 values(6);

已创建 1 行。

SQL> insert into sjh.test1 values(7);

已创建 1 行。

SQL> insert into sjh.test1 values(8);

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from sjh.test1;

ID

----------

1

2

3

4

5

6

7

8

已选择8行。

2.查看表的rowid信息和block id信息:

SQL> select rowid,id from sjh.test1;

ROWID                      ID

------------------ ----------

AAAMlQAAEAAAABHAAA          1

AAAMlQAAEAAAABHAAB          2

AAAMlQAAEAAAABHAAC          3

AAAMlQAAEAAAABHAAD          4

AAAMlQAAEAAAABHAAE          5

AAAMlQAAEAAAABHAAF          6

AAAMlQAAEAAAABHAAG          7

AAAMlQAAEAAAABHAAH          8

已选择8行。

SQL> select EXTENT_ID,FILE_ID,RELATIVE_FNO,BLOCK_ID,BLOCKS

2   from dba_extents where segment_name='TEST1';

EXTENT_ID    FILE_ID RELATIVE_FNO   BLOCK_ID     BLOCKS

---------- ---------- ------------ ---------- ----------

0          4            4         65          8

--8条记录都在一个块上(AAAABH)

这里简单介绍一下ROWID的知识:ROWID 在磁盘上需要10个字节的存储空间并使用18个字符来显示它包含下列组件:

数据对象编号:每个数据对象如表或索引在创建时都分配有此编号,并且此编号在数据库中是唯一的;

相关文件编号:此编号对于一个表空间中的每个文件是唯一的;

块编号:表示包含此行的块在文件中的位置;

行编号:标识块头中行目录位置的位置;

在内部数据对象编号需要32 位,相关文件编号需要10 位,块编号需要22,位行编号需要16 位,加起来总共是80 位或10 个字节,ROWID 使用以64 为基数的编码方案来显示该方案将六个位置用于数据对象,编号三个位置用于相关文件编号六个位置用于块编号三个位置用于行编号以64 为基数的编码方案使用字符A-Z a-z 0-9 + 和/共64 个字符。

如下例所示:AAAMlQ AAE AAAABH AAA

在本例中

AAAMlQ    是数据对象编号

AAE       是相关文件编号

AAAABH   是块编号

AAA      是行编号

3.做一些DML操作,再观察ROWID有没有发生变化:

SQL> delete from sjh.test1 where id=1;

已删除 1 行。

SQL> delete from sjh.test1 where id=3;

已删除 1 行。

SQL> delete from sjh.test1 where id=5;

已删除 1 行。

SQL> commit;

提交完成。

SQL> select rowid,id from sjh.test1;

ROWID                      ID

------------------ ----------

AAAMlQAAEAAAABHAAB          2

AAAMlQAAEAAAABHAAD          4

AAAMlQAAEAAAABHAAF          6

AAAMlQAAEAAAABHAAG          7

AAAMlQAAEAAAABHAAH          8

--我们看到ROWID保持不变。

4.做MOVE操作,然后观察ROWID的情况:

SQL> alter table sjh.test1 move;

表已更改。

SQL> select rowid,id from sjh.test1;

ROWID                      ID

------------------ ----------

AAAMlRAAEAAAABMAAA          2

AAAMlRAAEAAAABMAAB          4

AAAMlRAAEAAAABMAAC          6

AAAMlRAAEAAAABMAAD          7

AAAMlRAAEAAAABMAAE          8

SQL> select EXTENT_ID,FILE_ID,RELATIVE_FNO,BLOCK_ID,BLOCKS

2   from dba_extents where segment_name='TEST1';

EXTENT_ID    FILE_ID RELATIVE_FNO   BLOCK_ID     BLOCKS

---------- ---------- ------------ ---------- ----------

0          4            4         73          8

--ROWID发生变化BLOCK_ID由原来的65变为73,BLOCK的编号由原来的AAAABH变为AAAABM

5.move对HWM的影响:

SQL> create table my_objects tablespace HWM

2   as select * from all_objects;

SQL> delete from my_objects where rownum<10000;

9999 rows deleted

SQL> select count(*) from my_objects;

COUNT(*)

----------

21015

SQL> exec show_space(p_segname => 'MY_OBJECTS',p_owner => 'DLINGER',p_type => 'TABLE');

Total Blocks............................425

Total Bytes.............................3481600

Unused Blocks...........................3

Unused Bytes............................24576

Last Used Ext FileId....................11

Last Used Ext BlockId...................1294

Last Used Block.........................2

这里HWM=425 - 3 + 1 = 423

然后对table MY_OBJECTS进行move操作:

SQL> alter table MY_OBJECTS move;

表已更改。

SQL> exec show_space(p_segname => 'MY_OBJECTS',p_owner => 'DLINGER',p_type => 'TABLE');

Total Blocks............................290

Total Bytes.............................2375680

Unused Blocks...........................1

Unused Bytes............................8192

Last Used Ext FileId....................11

Last Used Ext BlockId...................1584

Last Used Block.........................4

我们可以看到,table MY_OBJECTS的HWM从423移动到290,table的HWM降低了!(show_space是自定义的一个过程)。

Move的一些用法:

以下是alter table 中move子句的完整语法,我们介绍其中的几点:

MOVE [ONLINE]

[segment_attributes_clause]

[data_segment_compression]

[index_org_table_clause]

[ { LOB_storage_clause | varray_col_properties }

[ { LOB_storage_clause | varray_col_properties } ]...

]

[parallel_clause]

a. 我们可以使用move将一个table从当前的tablespace上移动到另一个tablespace上,如:

alter table t move tablespace tablespace_name;

b. 我们还可以用move来改变table已有的block的存储参数,如:

alter table t move storage (initial 30k next 50k);

c.另外,move操作也可以用来解决table中的行迁移的问题。

使用move的一些注意事项:

a. table上的index需要rebuild:

在前面我们讨论过,move操作后,数据的rowid发生了改变,我们知道,index是通过rowid来fetch数据行的,所以,table上的index是必须要rebuild的。

SQL> create index i_my_objects on my_objects (object_id);

Index created

SQL> alter table my_objects move;

Table altered

SQL> select index_name,status from user_indexes where index_name='I_MY_OBJECTS';

INDEX_NAME                     STATUS

------------------------------ --------

I_MY_OBJECTS                   UNUSABLE

从这里可以看到,当table MY_OBJECTS进行move操作后,该table 上的inedx的状态为UNUSABLE,这时,我们可以使用alter index I_MY_OBJECTS rebuild online的命令,对index I_MY_OBJECTS进行在线rebuild。

b. move时对table的锁定

当我们对table MY_OBJECTS进行move操作时,查询v$locked_objects视图可以发现,table MY_OBJECTS上加了exclusive lock:

SQL>select OBJECT_ID, SESSION_ID,ORACLE_USERNAME,LOCKED_MODE from v$locked_objects;

OBJECT_ID SESSION_ID ORACLE_USERNAME    LOCKED_MODE

---------- ---------- ------------------ -----------

32471          9 DLINGER                      6

SQL> select object_id from user_objects where object_name = 'MY_OBJECTS';

OBJECT_ID

----------

32471

这就意味着,table在进行move操作时,我们只能对它进行select的操作。反过来说,当我们的一个session对table进行DML操作且没有commit时,在另一个session中是不能对这个table进行move操作的,否则oracle会返回这样的错误信息:ORA-00054: 资源正忙,要求指定 NOWAIT。

c. 关于move时空间使用的问题:

当我们使用alter table move来降低table的HWM时,有一点是需要注意的,这时,当前的tablespace中需要有1倍于table的空闲空间以供使用:

SQL> CREATE TABLESPACE TEST1

2   DATAFILE 'D:\ORACLE\ORADATA\ORACLE9I\TEST1.dbf' SIZE 5M

3   UNIFORM SIZE 128K ;

SQL> create table my_objects tablespace test1 as select * from all_objects;

表已创建。

SQL> select bytes/1024/1024 from user_segments where segment_name='MY_OBJECTS';

BYTES/1024/1024

---------------

3.125

SQL> alter table MY_OBJECTS move;

alter table MY_OBJECTS move

*

ERROR 位于第 1 行:

ORA-01652: 无法通过16(在表空间TEST1中)扩展 temp 段

SQL> ALTER DATABASE

2  DATAFILE 'D:\ORACLE\ORADATA\ORACLE9I\TEST1.DBF' RESIZE 7M;

数据库已更改。

SQL> alter table MY_OBJECTS move;

表已更改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 路径有汉字,路径文字工具

大家可能会在视频上面看到一些不规则的字幕吧&#xff0c;比如&#xff1a;圆形、椭圆、波浪形等等&#xff0c;这些也叫做路径文字&#xff0c;就是在给视频添加字幕的时候&#xff0c;让文字按着自己描绘的路径来排列&#xff0c;这样就得到了路径文字。原理很简单&#xff0…

在toad新增oracle用户,利用toad发现oracle自动为你干了什么(表空间建立和用户建立)...

利用toad发现oracle自动为你干了什么(表空间建立和用户建立)Oracle:10.2.0.1Windows 2003一、表空间sql>Create tablespace dba datafile ‘D:\dba.dbf’ size 1M autoextend on maxsize 10M;-- DBA (Tablespace)--CREATE TABLESPACE DBA DATAFILED:\DBA.DBF SIZE 1M AUTOE…

linux依据时间过滤文件,详解Linux查找目录下的按时间过滤的文件

在维护项目中&#xff0c;有时会指定都一些条件进行过滤文件&#xff0c;并对该批文件进行操作&#xff1b;这时我们将使用shell命令进行操作&#xff1b;直接上代码#!/bin/sh#BEGIN#find ./ ! -name "." -type d -prune -o -newermt 2001-01-01 00:00:00 ! -newermt…

linux view查看日志命令,【Linux】linux查看日志文件内容命令tail、cat、tac、head、echo...

linux查看日志文件内容命令tail、cat、tac、head、echotail -f test.log你会看到屏幕不断有内容被打印出来. 这时候中断第一个进程Ctrl-C,---------------------------linux 如何显示一个文件的某几行(中间几行)从第3000行开始&#xff0c;显示1000行。即显示3000~3999行cat fi…

qq linux版本下载官网下载,腾讯QQ For Linux

安装帮助如何选择安装包&#xff1f;Linux QQ 目前支持x64(x86_64、amd64)、arm64(aarch64)、mips64(mips64el)三种架构&#xff0c;每种架构支持Debian系、红帽系、Arch Linux系、其它发行版中的一种或几种(未来可能继续扩充)。每一次发布均会提供架构和发行版的若干种组合支持…

linux ip隧道技术,linux之IP隧道配置

本文系统Centos6.0在这里我就不讲什么隧道、IP隧道技术了&#xff1b;lvs的三种模式也不说了我这里隧道说白了就是不同机房&#xff0c;不同公网IP&#xff0c;怎么让他们实现局域网的效果&#xff0c;配置同一网段的私网IP&#xff1b;可以实现互联互通&#xff1b;写这篇文章…

windows控制linux桌面图标,完全控制你的Windows桌面 (转)

完全控制你的Windows桌面 (转)[more]完全控制你的桌面对于Windows的桌面界面相信大家已经十分熟悉了&#xff0c;占据屏幕大半部分的是桌面&#xff0c;在上面排列的是桌面图标。任务栏一般位于桌面的下面&#xff0c;也可以在桌面其它边缘。在最左边是“开始按钮”&#xff0c…

windows查看linux文件中文,Linux 系统下无法查看Windows 中创建的中文文件名

标 题: Linux 系统下无法查看Windows 中创建的中文文件名我是Linux初学者&#xff0c;在网上搜索了很久&#xff0c;经过多次尝试仍然无法解决问题&#xff0c;只好在这里发贴请教了&#xff0c;还望各位高手指点一下。问题描述&#xff1a;Linux 系统下无法查看Windows 中创建…

arm-none-linux-gnueabi-gcc:未找到命令,“make: arm-none-linux-gnueabi-gcc:命令未找到”

Ubuntu12.04下编译飞凌嵌入式OK6410开发板提供的内核android2.3_kernel_v1.01-2012-09-23.tar已经执行export PATH/usr/local/arm/arm-none-linux-gnueabi/bin:$PATH&#xff0c;但还是出现如下问题make: arm-none-linux-gnueabi-gcc&#xff1a;命令未找到CHK include/lin…

linux 内核入口地址,linux内核的加载地址和入口地址

编译完内核之后&#xff0c;会产生zImage,而把它直接导入0x30008000&#xff0c;会出现Bad Magic Number.查明是需要将内核加一个0x40大小的头,由mkimage工具来添加.mkimage在编译u-boot时在u-boot-1.1.6/tools下生成,可以为编译的内核添加头信息的.在bootm命令中会解析这个头,…

linux脚本监控某一进程,linux监控某个进程的运行shell脚本

该脚本实现了对指定进程名的进程进行每隔2的扫描监控&#xff0c;一旦发现进程不存在便重新启动。#!/bin/sha10;while [[ a -gt 5 ]]; doif test $(pgrep -f $1|wc -l) -eq 2;thensh stop.shgnome-terminal -x sh start.sh &fi;sleep 2;done;总结&#xff1a;(1)&表示当…

kali linux conky配置文件,7个美丽的Conky配置为您的Linux桌面 | MOS86

现在&#xff0c;大多数Linux用户非常熟悉Conky包括多少人都没有今天我们Note:其中一些不仅仅是一个习惯。conkyrc文件。许多都配有专门的字体或附加软件&#xff0c;有些则作为更大的桌面主题的一部分打包。此处列出的所有配置都提供了到原始下载位置以及每个包的链接此外&…

sd卡linux错误检测,android系统正在准备SD卡正在检测是否有错误且SD卡无法读取解决办法...

手机android系统&#xff0c;也许您会碰到这样的情况。错误提示&#xff1a;正在准备SD卡 正在检测是否有错误。这时sd卡(即内存卡)不能正常使用&#xff0c;不管手机自带的程序&#xff0c;还是通过usb口连接到电脑都无法识别sd卡。这可能是由于没有正常卸载sd卡导致的原因。比…

linux+系统优化基础,Linux入门基础(三):Linux用户及权限基础

用户基础用户和组每个用户都拥有一个userid每个用户都属于一个主组,属于一个或多个附属组每个组拥有一个groupid每个进程以一个用户身份运行,受该用户可访问资源限制每个可登陆用户拥有一个指定的shell用户userid为32位,从0开始,为了和老式系统兼容,用户id限制在60000以下用户分…

linux dhcp 负载均衡,dhcp双机负载均衡

dhcp双机负载均衡1&#xff1a;环境介绍&#xff1a;我是用两个linux机器(dhcpd server 一个是master &#xff0c;一个是slave)和一个windows xp机器来做的(测试用的client&#xff01;) &#xff0c;master:ip:172.17.61.124netmask&#xff1a;255.255.255.0gw&#xff1a;1…

c语言 字节转换成位,C语言中的字节序和指针转换

我在计算机上用以下代码部分编写了一个C程序&#xff1a;uint32_t test 0x01020304;uint8_t array[4];memcpy(array, &test, 4);printf("%02x %02x %02x %02x",array[0], array[1], array[2], array[3]);它打印04030201&#xff0c;但我希望是01020304。我是否必…

C语言顺序结构程序设计PPT,C语言习题集与实验指导 教学课件 伍鹏、杜红、王圆妹、邓绍金 第3章 顺序结构程序设计.pdf...

[摘要]第3章 顺序结构程序设计 第3章 顺序结构程序设计 当你对C语言程序设计有了一定了解和掌握后&#xff0c; 在处理一些简单的任务时&#xff0c;若想根据程序书写的过程 顺序执行程序&#xff0c;这时应该如何处理呢&#xff1f; •顺序结构 •顺序结构 程序的三种结构 程序…

c语言调用exe并传递参数,如何使用execlp将命令行参数传递给C程序

This page包括大量的使用示例....编辑&#xff1a;从链接 从链路的代码段添加的代码片段上方static void show_info_page(const char *git_cmd){const char *page cmd_to_page(git_cmd);setenv("INFOPATH", system_path(GIT_INFO_PATH), 1);execlp("info"…

c语言include math.h,在C语言中,若需调用数学类库函数第数据进行处理,则需包含头文件______. 答案:math.h;#includemath.h;math.h;“math....

相关问题设随机变量X的密度函数为&#xff0c;则c .e339fd828a3e5af974ac21fd9ebc7f0b.gif有函数f(x,y,z)&#xff0c;其中x∈[1900,2100]&#xff0c;y∈[1,12]&#xff0c;z∈[1,31]的。请写出该函数采用边界值分析法设计的测试用例函数重写与函数重载的相同之处是&#xff1…

c语言sin函数返回nan,C语言入口函数和LD_PRELOAD环境变量

零.C语言入口函数从第一天学习C语言开始,我们的脑子里就深深烙下这样一个概念:C语言程序总是从main()函数开始执行,main()函数结束,程序也就结束了.在平时的练习中貌似这没有问题,但事实真的是这样吗?测试一下,点击(此处)折叠或打开#include #include #include int enter(void…