shrink_clause:

  http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_3001.htm#i2192484

首先oracle shrink 是10g之后才引出的,有shrink table 和shrink space两种,这里介绍shrink space

压缩分两个阶段:

1、数据重组:这个过程是通过一系列的insert delete操作,将数据尽量排在列的前面进行重新组合。

2、HWM调整:这个过程是对HWM的调整,释放空闲数据库。

PS:shrink之间必须开启行移动功能

alter table table_name enable row movement;

基本语法:

alter table <table_name> shrink space [ <null> | cascade | compact  ];

--alter table <table_name> shrink space compact;

只收缩表,这个实际上是只执行了第一个阶段,HWM保持不变。

--alter table <table_name>  shrink space cascade;

收缩表并且相关索引也会被收缩,HWM会降低

--alter table <table_name> shrink space;

收缩表,降低HWM(High Water Mark)

限制条件:
1、不能对cluster、clustered  table 或者任何有LONG列的对象使用这个语句
2、压缩段不支持有函数索引、位图链接索引的表
3、这语句不能压缩二级索引表的映射表,即使设置了CASCADE
4、不能对压缩表使用该语句
5、不能压缩on commit 类型的物化视图的主表,rowid物化视图必须在压缩操作之后重建
详解:
oracle10g开始提供shrink的命令,要求表空间是自动段空间管理(ASSM),降低HWM。
 
segment shrink 分为两个阶段:
 
1、数据重组(compact):通过一系列insert、delete操作,将数据尽量排在段的前面,这个过程中需要在表上加RX锁,及只需要移动的行上加锁。由于涉及到rowid的改变,需要enable row movement。同时要distable基于rowid的triggers,这个过程对业务影响比较小(--由于采用compact,只有涉及移动的行才加锁,所以不会锁定整个表,其他的DML操作有部分可以进行,进而减小系统高峰期的性能开销)
 
2、HWM调整:第二阶段是调整HWM位置,释放空闲数据块,此过程需要在表上加X锁(独享锁,因此这个表都被锁定,如果系统处在高峰期的时候,其他在此表的DML被挂起,会产生严重阻塞),会造成表上所有DML语句阻塞,系统忙时影响较大,
锁的内容参考:http://docs.oracle.com/cd/B19306_01/server.102/b14220/consist.htm
  • shrink space语句两个阶段都执行
  • shrink space compact语句只执行第一个阶段。
  • 在业务繁忙的时候,可以先执行shrink space compact重组数据,然后不满的时候执行shrink space降低HWM释放空闲数据块。
  • shrink必须开启对象的row movement功能(shrink index 不需要),alter table table_name enable row movement.但是要注意,该语句会造成引用table_name的对象(如存储过程、包、试图等)变为无效,执行完最好由utlrp.sql来编译无效对象。
  • shrink不会使表的索引失效。但是move会,因此,move后必须重建索引,(alter table table_name move;alter index index_name rebuild)
 
语法:
alter table shrink space[|cpmpact|cascade];
alter table shrink space compcat; 把块中的数据堆到一起,但会保持high water mark
alter table shrink space;收缩表,降低high water mark
alter table shrink space cascade;收缩表,降低high water mark,并相关索引也要收缩。
alter index indexname shrink space;收缩索引

补充:
--编译无效对象脚本utlrp.sql

  >$ sqlplus /no log
    SQL>connect sys/pwd@sid AS sysdba
    SQL>@?/rdbms/admin/utlrp.sql

  utlrp.sql脚本可以在数据库运行的状态下执行以编译、数据库中的invalid对象. 
  oracle建议在对数据库进行迁移、升级、降级后都运行一遍utlrp.sql以编译无效对象。

--打完patch后重建数据字典视图脚本catpatch.sql

  为了保证系统的的数据词典的完整性和有效性,最好的打patch后在migrate状态下运行catpatch.sql 
  sql> shutdown immediate 
  sql> startup migrate 
  sql> @?/rdbms/admin/catpatch.sql 
  sql> shutdown immediate 
  sql> startup

  为加快速度,可临时调大这2个参数: 
  show parameter shared_pool_size 
  show parameter large_pool_size 

1.1 创建ASSM的表空间

SQL> set serveroutput on

SQL> create tablespace ASSM datafile '/oradata/ltest/assm.dbf' size 10m autoextend on SEGMENT SPACE MANAGEMENT AUTO;

Tablespace created

SQL> select tablespace_name,

2         block_size,

3         extent_management,

4         allocation_type,

5         segment_space_management

6    from dba_tablespaces

7   where tablespace_name = 'ASSM';

TABLESPACE_NAME BLOCK_SIZE EXTENT_MANAGEMENT ALLOCATION_TYPE SEGMENT_SPACE_MANAGEMENT

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

ASSM                  8192 LOCAL             SYSTEM          AUTO

1.2 建表

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

Table created

SQL> select count(*) from my_objects;

COUNT(*)

----------

49903

2 实验前的信息

SQL> exec show_space('MY_OBJECTS');

Total Blocks  ..........................768

Total Bytes   ..........................6291456

Total MBytes  ..........................6

Unused Blocks ..........................62

Unused Bytes  ..........................507904

Unused KBytes ..........................496

Last Used Ext FileId....................7

Last Used Ext BlockId...................649

Last Used Block.........................66

The segment is analyzed below

FS1 Blocks (0-25)   ....................0

FS2 Blocks (25-50)  ....................0

FS3 Blocks (50-75)  ....................0

FS4 Blocks (75-100) ....................0

Unformatted Blocks  ....................0

Full Blocks         ....................686

PL/SQL procedure successfully completed

3 删除后的信息

然后我们随机地从table MY_OBJECTS中删除一部分数据:

SQL> delete from my_objects where object_name like '%C%';

17674 rows deleted

SQL> delete from my_objects where object_name like '%U%';

4687 rows deleted

SQL> delete from my_objects where object_name like '%A%';

7010 rows deleted

SQL> exec show_space('MY_OBJECTS');

Total Blocks  ..........................768

Total Bytes   ..........................6291456

Total MBytes  ..........................6

Unused Blocks ..........................62

Unused Bytes  ..........................507904

Unused KBytes ..........................496

Last Used Ext FileId....................7

Last Used Ext BlockId...................649

Last Used Block.........................66

The segment is analyzed below

FS1 Blocks (0-25)   ....................0

FS2 Blocks (25-50)  ....................212

FS3 Blocks (50-75)  ....................181

FS4 Blocks (75-100) ....................245

Unformatted Blocks  ....................0

Full Blocks         ....................48

PL/SQL procedure successfully completed

这里,table my_objects的HWM下有706(768 - 62)个block,其中,free space为25-50%的block有205个,free space为50-75%的block有180个,free space为75-100%的block有229个,full space的block只有45个,这种情况下,我们需要对这个table的现有数据行进行重组。

4 shink操作

要使用assm上的shink,首先我们需要使该表支持行移动,可以用这样的命令来完成:

SQL> alter table my_objects enable row movement;

Table altered

现在,就可以来降低my_objects的HWM,回收空间了,使用命令:

SQL> alter table my_objects shrink space;

Table altered

SQL> exec show_space('MY_OBJECTS');

Total Blocks  ..........................280

Total Bytes   ..........................2293760

Total MBytes  ..........................2.1875

Unused Blocks ..........................5

Unused Bytes  ..........................40960

Unused KBytes ..........................40

Last Used Ext FileId....................7

Last Used Ext BlockId...................265

Last Used Block.........................19

The segment is analyzed below

FS1 Blocks (0-25)   ....................0

FS2 Blocks (25-50)  ....................1

FS3 Blocks (50-75)  ....................1

FS4 Blocks (75-100) ....................0

Unformatted Blocks  ....................0

Full Blocks         ....................259

PL/SQL procedure successfully completed

在执行玩shrink命令后,此时表my_objects的HWM现在降到了276(280 - 5 + 1)的位置,而且HWM下的block的空间使用状况,full space的block有259个,free space 为25-50% 和50-75% Block只有1个。

5 shrink space原理剖析

5.1 实验环境

SQL> create table TEST_HWM (id int ,name char(2000)) tablespace ASSM;

Table created

SQL> insert into TEST_HWM values (1, 'aa');

1 row inserted

SQL> insert into TEST_HWM values (2, 'bb');

1 row inserted

SQL> insert into TEST_HWM values (3, 'cc');

1 row inserted

SQL> insert into TEST_HWM values (4, 'ds');

1 row inserted

SQL> insert into TEST_HWM values (5, 'dss');

1 row inserted

SQL> insert into TEST_HWM values (6, 'dss');

1 row inserted

SQL> insert into TEST_HWM values (7, 'ess');

1 row inserted

SQL> insert into TEST_HWM values (8, 'es');

1 row inserted

SQL> insert into TEST_HWM values (9, 'es');

1 row inserted

SQL> insert into TEST_HWM values (10, 'es');

1 row inserted

5.2 删除前rowid状态

SQL> select id,

2         name,

3         rowid,

4         dbms_rowid.rowid_object(rowid) object_id,

5         dbms_rowid.rowid_relative_fno(rowid) file_id,

6         dbms_rowid.rowid_block_number(rowid) block_id,

7         dbms_rowid.rowid_row_number(rowid) num

8    from test_hwm;

ID NAME  ROWID               OBJECT_ID    FILE_ID   BLOCK_ID        NUM

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

1 aa    AAANAqAAHAAAAElAAA      53290          7        293          0

2 bb    AAANAqAAHAAAAElAAB      53290          7        293          1

3 cc    AAANAqAAHAAAAElAAC      53290          7        293          2

4 ds    AAANAqAAHAAAAEmAAA      53290          7        294          0

5 dss   AAANAqAAHAAAAEmAAB      53290          7        294          1

6 dss   AAANAqAAHAAAAEmAAC      53290          7        294          2

7 ess   AAANAqAAHAAAAEnAAA      53290          7        295          0

8 es    AAANAqAAHAAAAEnAAB      53290          7        295          1

9 es    AAANAqAAHAAAAEnAAC      53290          7        295          2

10 es    AAANAqAAHAAAAEoAAA      53290          7        296          0

10 rows selected

5.3 删除后rowid状态

然后从table test_hwm中删除一些数据:

SQL> delete from TEST_HWM where id = 2;

1 row deleted

SQL> delete from TEST_HWM where id = 3;

1 row deleted

SQL> delete from TEST_HWM where id = 4;

1 row deleted

SQL> delete from TEST_HWM where id = 7;

1 row deleted

SQL> delete from TEST_HWM where id = 8;

1 row deleted

SQL> select id,

2         name,

3         rowid,

4         dbms_rowid.rowid_object(rowid) object_id,

5         dbms_rowid.rowid_relative_fno(rowid) file_id,

6         dbms_rowid.rowid_block_number(rowid) block_id,

7         dbms_rowid.rowid_row_number(rowid) num

8    from test_hwm;

ID NAME  ROWID               OBJECT_ID    FILE_ID   BLOCK_ID        NUM

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

1 aa    AAANAqAAHAAAAElAAA      53290          7        293          0

5 dss   AAANAqAAHAAAAEmAAB      53290          7        294          1

6 dss   AAANAqAAHAAAAEmAAC      53290          7        294          2

9 es    AAANAqAAHAAAAEnAAC      53290          7        295          2

10 es    AAANAqAAHAAAAEoAAA      53290          7        296          0

从以上的信息,可知表test_hwm中,剩下的数据是分布在AAAAEl,AAAAEm,AAAAEn,AAAAEo这样四个连续的block中。

SQL> exec show_space('TEST_HWM');

Total Blocks  ..........................8

Total Bytes   ..........................65536

Total MBytes  ..........................0.0625

Unused Blocks ..........................0

Unused Bytes  ..........................0

Unused KBytes ..........................0

Last Used Ext FileId....................7

Last Used Ext BlockId...................289

Last Used Block.........................8

The segment is analyzed below

FS1 Blocks (0-25)   ....................0

FS2 Blocks (25-50)  ....................1

FS3 Blocks (50-75)  ....................3

FS4 Blocks (75-100) ....................1

Unformatted Blocks  ....................0

Full Blocks         ....................0

PL/SQL procedure successfully completed

通过show_space_assm我们可以看到目前这四个block的空间使用状况,AAAAEl,AAAAEn,AAAAEo上各有一行数据,可以猜测free space为50-75%的3个block是这三个block,那么free space为25-50%的1个block就是AAAAEm了,剩下free space为 75-100% 的3个block,是HWM下已格式化的尚未使用的block。

5.4 shrink后rowid状态

SQL> alter table my_objects enable row movement;

Table altered

SQL> alter table my_objects shrink space;

Table altered

SQL> select id,

2         name,

3         rowid,

4         dbms_rowid.rowid_object(rowid) object_id,

5         dbms_rowid.rowid_relative_fno(rowid) file_id,

6         dbms_rowid.rowid_block_number(rowid) block_id,

7         dbms_rowid.rowid_row_number(rowid) num

8    from test_hwm;

ID NAME  ROWID               OBJECT_ID    FILE_ID   BLOCK_ID        NUM

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

9 es    AAANAqAAHAAAAEkAAA      53290          7        292          0

10 es    AAANAqAAHAAAAEkAAB      53290          7        292          1

1 aa    AAANAqAAHAAAAElAAA      53290          7        293          0

5 dss   AAANAqAAHAAAAEmAAB      53290          7        294          1

6 dss   AAANAqAAHAAAAEmAAC      53290          7        294          2

当执行了shrink操作后,可以发现shrink操作与move不太一样。在move操作的时候,所有行的rowid都发生了变化,table所位于的block的区域也发生了变化,但是所有行物理存储的顺序都没有发生变化,所以我们得到的结论是,oracle以block为单位,进行了block间的数据copy。而在shrink后,部分行数据的rowid发生了变化,同时,部分行数据的物理存储的顺序也发生了变化,而table所位于的block的区域却没有变化(ID为1,5,6的rowid没有发生变化,ID为9,10两行数据,原来在AAAAEn,AAAAEo上都移到AAAAEk上)。以上说明,shrink只移动了table其中一部分的行数据,来完成释放空间,而且,这个过程是在table当前所使用的block中完成的。

6 shrink的注意点

1. move时产生的日志比shrink时少.参看http://blog.csdn.net/huang_xw/article/details/7016365

2. shrink在移动行数据时,也一起维护了index上相应行的数据rowid的信息,当然shrink过程中用来维护index的成本也会比较高。而表move后index的状态是UNUSABLE的,需要进行rebuild。参见http://blog.csdn.net/huang_xw/article/details/7016415

3. oracle是从后向前移动行数据,那么,shrink的操作就不会像move一样,shrink不需要使用额外的空闲空间。

转载于:https://www.cnblogs.com/klb561/p/10995016.html

Oracle中shrink space命令相关推荐

  1. Oracle中shrink space命令详解

    从10g开始,oracle开始提供Shrink的命令,假如我们的表空间中支持自动段空间管理(ASSM),就可以使用这个特性缩小段,即降低HWM.这里需要强调一点,10g的这个新特性,仅对ASSM表空间 ...

  2. oracle中的set命令,oracle中常用的set命令

    time:2008/2/1 author: skate oracle中常用的set命令 前一阵在做数据库数据的转移,所以就写个shell脚本来自动化完成,用shell脚本生成sql脚本时,就要用到 o ...

  3. Oracle中不常用命令

    1.切换归档模式 查看存档模式 SQL> archive log list; 数据库日志模式             非存档模式                   此时为非存档模式 自动存档 ...

  4. Oracle中常用的命令,随着学习进度总结

    原创作品,欢迎转载,转载请在文章显眼位置注明出处:https://www.cnblogs.com/sunshine5683/p/10016569.html 开始之前先注意:在linux中切换到sqlp ...

  5. Oracle中的move命令

          从8i开始,oracle开始提供Move的命令.我们通常使用这个命令,将一个table segment从一个tablespace移动到另一个tablespace.Move实际上是在bloc ...

  6. oracle中的 expdp命令,Oracle 10G 数据泵中EXPDP命令行选项介绍

    以下的文章主要是浅谈Oracle 10G 数据泵学习纪要中EXPDP命令行选项,我在一个信誉度很好的网站找到一个关于Oracle 10G 数据泵学习纪要中EXPDP命令行选项的资料,拿出来供大家分享. ...

  7. oracle lsnrctl命令,oracle 中的lsnrctl命令

    作为oracle监听命令 在启动.关闭或者重启oracle监听器之前确保使用lsnrctl status命令检查oracle监听器的状态: 1.$lsnrctl status:检查当前监听器的状态 2 ...

  8. oracle中spool命令的使用,Oracle中Spool命令的使用方法实例

    Oracle中Spool命令的使用方法实例 前言 对于Oracle中的Spool命令,其实还可以换一种问法为,如何将sqlplus中的结果输出到指定的文件夹中. 近期在进行Oracle数据库备份的时候 ...

  9. Alter index coalesce VS shrink space

    10g中引入了对索引的shrink功能,索引shrink操作会扫描索引的页块,并且通过归并当前存在的数据将先前已删除记录的空间重新利用:很多书籍亦或者MOS的Note中都会提及SHRINK命令与早期版 ...

最新文章

  1. 官方iPhone SDK和开源工具链
  2. Zookeeper一致性级别分析,面试题附答案
  3. 转行python能拿到多少钱_想转行学python过来人提醒大家几点
  4. 未检测到其他显示器_如何将 Surface 连接到电视、显示器或投影仪,我教你
  5. PHP error_reporting() 错误控制函数功能详解
  6. java webservice用户验证_java webservice 用户验证 (服务端 + 客户端)
  7. html怎么让字体自动变色,html怎么给字体设置颜色
  8. 汇编语言 王爽 第四版 第一章 检测点1.1
  9. 大漠插件ocr多选字库_大漠ocr识别字库的生成,和使用方法
  10. cmd命令实现百度云盘光速下载
  11. 硅钢片铁芯、坡莫合金、非晶及纳米晶软磁合金
  12. 《卓有成效的管理者(The Effective Executive)》读后感
  13. php Excel 合并单元格
  14. 聚焦应用场景,OriginOS全面焕新用户体验
  15. 【数据库】PostgreSQL简介
  16. 【我奶奶都能看懂系列005】☀️python基础语法——容器,小学生也可以学!
  17. PPC音量太小和听筒音太小的解决方法
  18. 人工智能与智能的异同
  19. 快时钟到慢时钟的同步问题
  20. ios 关于常用的一些第三方框架的介绍

热门文章

  1. nginx 1.11.0实现http和https正向代理
  2. SCOM监控APC-UPS不间断电源设备
  3. Java8 本地DateTime API
  4. Linux substring if
  5. 咨询的真相5:咨询业的“前世今生”
  6. 严重漏洞已存在16年,数亿台打印机受影响
  7. csharp: json to csharp
  8. html position的学习
  9. 谈谈JavaScript中function多重理解
  10. python下使用pymongo操作mongodb