alter table move和shrink space 区别
- 格式:docx
- 大小:15.27 KB
- 文档页数:6
oracle回收表空间的几种方法在Oracle数据库中,表空间是用来存储表、索引和其他数据库对象的逻辑存储单元。
随着数据库的使用,表空间中的数据会增长,导致表空间的碎片化和浪费。
为了解决这个问题,需要进行表空间的回收。
本文将介绍Oracle回收表空间的几种方法。
1. 使用ALTER TABLESPACE语句收缩表空间ALTER TABLESPACE语句可以用来收缩表空间,将碎片化的空间合并为连续的空间,从而减少空间的浪费。
语法如下:```ALTER TABLESPACE tablespace_name SHRINK SPACE;```其中,tablespace_name是要回收的表空间的名称。
执行该语句后,Oracle会自动将碎片化的空间合并,从而减少空间的浪费。
2. 使用ALTER TABLESPACE语句修改表空间的大小如果表空间中存在过多的未使用空间,可以通过修改表空间的大小来回收空间。
可以使用ALTER TABLESPACE语句来修改表空间的大小。
语法如下:```ALTER TABLESPACE tablespace_name RESIZE new_size;```其中,tablespace_name是要修改大小的表空间的名称,new_size是新的表空间大小。
执行该语句后,Oracle会将表空间的大小修改为新的大小,从而回收未使用的空间。
3. 使用REORGANIZE TABLE语句重建表在表空间中存在大量碎片化的数据时,可以使用REORGANIZE TABLE语句来重建表,从而回收空间。
语法如下:```ALTER TABLE table_name MOVE TABLESPACE tablespace_name;```其中,table_name是要重建的表的名称,tablespace_name是目标表空间的名称。
执行该语句后,Oracle会将表重建到目标表空间中,从而回收空间。
4. 使用EXPORT和IMPORT工具导出和导入表数据如果表空间中存在大量未使用的空间,可以使用EXPORT和IMPORT工具将表数据导出到一个新的表空间中,然后再导入回原来的表空间,从而回收空间。
表和表空间:释放表空间采用altertablemove,没意识到影响展开全文通过前面两节学习可知,deltete不会释放表空间,但是可以重用,也就是插入可以填补空洞,当然现实应用中确实是存在经常删除很少插入的情况,这样就存在了释放表空间优化数据库的可行性了,truncate有不能带条件的缺陷,自然就想到用alter table move重移表空间的方法。
这里要注意三个要素1、 alter table move 省略了tablespace XXX, 表示用户移到自己默认的表空间,因此当前表空间至少要是该表两倍大,这很好理解,由于易错所以提出,就不再细说了。
2、alter table move过程中会导致索引失效,必须要考虑重新索引3、alter table move过程中会产生锁,应该避免在业务高峰期操作!就第二点和第三点做实验说明如下吧Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0Connected as ljb先获取该SESSION的SID,方便实验观察SQL> select sid from v$mystat where rownum=1;SID--------------------160SQL> create table ljb_test as select * from dba_objects;Table createdSQL> select count(*) from ljb_test;COUNT(*)-------------------62659SQL> create index idx_test on ljb_test(object_id);Index created查询当前该SESSION并无锁SQL> select * from v$lock where sid=160;ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK -------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------------------------------------- 查看索引状态也正常!SQL> select index_name,table_name,status from user_indexes where table_name='LJB_TEST';INDEX_NAME TABLE_NAME STATUS------------------------------ ------------------------------ -----------------------------------------------IDX_TEST LJB_TEST VALIDalter table ljb_test move;重新再开一个窗口执行如下命令,发现锁已经产生了select * from v$lock where sid=160;ADDR KADDR SID TYPE ID1 ID2 LMODE REQ UEST CTIME BLOCK-------- -------- ------ ---- ------- ---------- ------ -------- ------ ------------------------------------------------------------------ 2043451C20434530 160 CF 0 0 4 0 0 0 1FA072BC1FA073D8 160 TX 917534 592 6 0 1 0 204344C0204344D4 160 HW 76 323783147 6 0 01F9C42241F9C423C 160 TM 84825 0 6 0 0 0 204342F420434308 160 TT 76 16 4 0 0 0 1F9C377C1F9C37C4 160 TS 76 323783147 6 0 0 0不过由于alter table move命令未结束,索引仍然有效!SQL> select index_name,table_name,status from user_indexes where table_name='LJB_TEST';INDEX_NAME TABLE_NAME STATUS------------------------------ ------------------------------ ----------------------------------------------------IDX_TEST LJB_TEST VALID等alter table ljb_test move;命令结束后,再查看发现锁消失了SQL> select * from v$lock where sid=160;ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK -------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ------------------------------------------ 但是索引却失效了!SQL> select index_name,table_name,status from user_indexes where table_name='LJB_TEST';INDEX_NAME TABLE_NAME STATUS ------------------------------ ------------------------------ ----------------------------------------------------IDX_TEST LJB_TEST UNUSABLE总结:这个实验说明:除了知道alter table move命令可以释放空间(当然这语句最根本的作用还是移动表到不同的表空间去,这里只是借用它可以释放空间的一个特性),还要了解该动作会锁表直到命令结束,而且会导致索引失效,属于危险命令,建议千万不要在业务高峰期操作。
ORACLE移表空间操作说明移动一个表到另一个表空间move一个表到另外一个表空间时,索引不会跟着一起move,而且会失效。
(LOB类型例外)表move,我们分为:*普通表move*分区表move*LONG,LOB大字段类型move来进行测试和说明。
索引的move,我们通过rebuild来实现(1)move普通表、索引基本语法:alter table tab_name move tablespace tbs_name;move过的普通表,在不用到失效的索引的操作语句中,语句执行正常,但如果操作的语句用到了索引(主键当做唯一索引),则此时报告用到的索引失效,语句执行失败,其他如外键,非空约束,缺省值等不会失效。
我们需要重新创建主键或索引,基本语法为:alter index index_name rebuild;alter index pk_name rebuild;如果我们需要move索引,则使用rebuild语法:alter index index_name rebuild tablespace tbs_name;alter index pk_name rebuild tablespace tbs_name;提示:查询表所具有的索引,可以使用user_indexes视图(索引和主键都在这个视图里可找到)。
(2)move分区表及索引和普通表一样,索引会失效,区别的仅仅是语法而已。
分区基本语法:特别提醒注意,如果是单级分区,则使用关键字PARTITION,如果是多级分区,则使用SUBPARTITION替代PARTITION。
如果分区或分区索引比较大,可以使用并行move或rebuild,PARALLEL (DEGREE 2); 如:ALTER TABLE PART_ALARMTEXTDATA move SUBPARTITIONALARMTEXTDATA_050910_A TD01 TABLESPACE users PARALLEL (DEGREE 2);ALTER INDEX GLOBAL_ALARMTEXTDATA REBUILD tablespace users PARALLEL (DEGREE 2);ALTER INDEX LOCAL_ALARMTEXTDATA REBUILD SUBPARTITION ALARMTEXTDATA_050910_A TD01 TABLESPACE users PARALLEL (DEGREE 2);移动表的某个分区:================ALTER TABLE tab_name move PARTITION partition_name TABLESPACE tbs_name;重建全局索引:================ALTER INDEX global_index REBUILD;或ALTER INDEX global_index REBUILD tablespace tbs_name;重建局部索引:================ALTER TABLE tab_name MODIFY PARTITION partition_name REBUILD UNUSABLE LOCAL INDEXES;或ALTER INDEX local_index_name REBUILD PARTITION partition_name TABLESPACE tbs_name;提示:USER_PART_TABLESUSER_IND_PARTITIONSUSER_IND_SUBPARTITIONSUSER_LOB_PARTITIONSUSER_LOB_SUBPARTITIONSUSER_PART_INDEXESUSER_PART_LOBS可查询分区相关内容,同时,分区对象,也是segment,所以也可在dba_segments里查的到。
SYSAUX表空间满对数据库的影响以及解决措施转载最后发布于2018-01-01 22:59:25 阅读数 681 收藏1.概要SYSAUX表空间满了,会影响登录嘛?会影响数据库正常运⾏吗?怎么处理呢?容易的想到,增加空间,删除被耗的空间,⾸先恢复⽣产业务为重。
对于排查消耗SYSAUX空间⼤的对象,⽆论哪个版本,都⼀样,查看是否存放较⼤的业务表,或者个⼈的中间表。
对于12C来说,更加关注的⼀个就是:数据库的audit_trail审计参数是否为开启的,如果该参数值为DB,则关注ausdsys模式下的audsys组件,即audsys.CLI_SWP$459d3b9$1$1表的lob段SYS_LOB0000091784C00014$$的⼤⼩。
如果为NONE,则和10G与11G的排查⼀样的思路去排查SYSAUX⾥的⼤对象。
2.案例分析1、备份检查在⽇常的备份维护当中,从备份检查集中采集的结果发现,多个库的归档备份失败。
2、检查归档备份或者全库的备份的⽇志输出3、检查catalog库的audit_trail参数values=’DB’.4、查看该库的alert⽇志:5、查看消耗SYSAUX表空间⼤的对象(段):其中,audsys组件的lob段占了31.5G。
6、尝试使⽤sys⽤户对该lob段对应的表进⾏truncate:发现sys⽤户也没有权限。
7、使⽤存储过程执⾏清理:begindbms_audit_mgmt.clean_audit_trail(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,use_last_arch_timestamp => FALSE);end;/附:oracle官⽹提供的清理⽅法,查看:1>.exec DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP ( -AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, -LAST_ARCHIVE_TIME => sysdate);2>.exec DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL( -AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, -USE_LAST_ARCH_TIMESTAMP => TRUE);8、检查sysaux表空间释放,调整审计参数audit_trail参数values=’NONE’。
EAS附件迁移操作手册金蝶软件(中国)有限公司2019年03月EAS附件迁移操作手册一、迁移背景说明在EAS v7.0版本时,所有附件都是保存在EAS账套的附件表中,由于EAS协同的单据都存在大量的附件,导致附件表的容易达到120G,点到整个账套的70%左右,导致出现下列问题:1.备份时间长(单表过大,加上并行参数后效果不明显),备份一次需要耗时6小时(7.0环境),4小时(8.5环境);2.备份占用空间过多,以保留备份周期为一周计算,光是附件就需要耗费840G左右的空间,目前的存储空间无法满足要求。
二、迁移方案介绍EAS平台支持三种附件管理方案,分别是DB方式、FTP服务器、EASSERVER,三种方式使方式来管理附件,维护简单,同时还可以节约大量的空间,以EAS账套备份存留一周计算:1.DB存储:120*7=840G2.EASSERVER:120*2=240G可以减少600G的备份空间需求。
三、附件迁移步骤1.修改附件存储方式菜单:系统平台->系统工具-参数设置2.设置附件存储路径菜单:系统平台->系统工具-附件EAS目录设置操作要点:1)存储目录要保存维护EAS的用户有写权限;2)保存后,需要点“”启用之后才能使用。
3.附件迁移菜单:系统平台->系统工具-附件EAS目录设置设置好参数和目录后,点击“附件迁移”,在出来的界面上按提示进行迁移,直到提示已完成100%。
注意:迁移到100%时,完成”按钮不会显示可用状态,实际上已迁移完成(产品BUG?),直接后台终止掉进程即可。
四、附件空间回收数据迁移后,原来附件占用的表空间并不会释放,需要在数据库中对空间进行回收,这样才能达到备份瘦身及减少备份时间的效果。
具体操作步骤如下:1.附件表启用move支持alter table t_bas_attachment move;2.附件表附件字段空间回收alter table t_bas_attachment modify lob(FFILE) (shrink space);3.索引重建(否则上传附件时可能会报错)alter index PK_ATTACHMENT rebuild;--解决附件上传时提示异常:create data error.ORA-01502: 索引 'SSLDBA850.PK_ATTACHMENT' 或这类索引的分区处于不可用状态4.检查回收后的表空间占用情况五、迁移前后数据对比备份时间4小时15分钟6分34秒提升39倍。
oracle碎片小结oracle碎片小结我们在使用windows的时候,都知道要定期整理磁盘碎片,因为磁盘碎片会影响性能,给管理上带来额外的负担。
那oracle更是如此,当随着数据增加,oracle处理海量数据本身就已经很费力了啊,如果再有大量的碎片,那就是雪上加霜啊。
所以碎片要引起dba的高度重视,尽早发现尽早处理。
碎片是怎么产生的呢?简单理解就是由于更新和删除产生一些碎小的不能被再次使用的空间,根据每种不同的碎片他们的产生也是有区别的block-level 的碎片,而block 又分为data block 和index block,在data block 中存放的是row 数据,在index block中存放的是索引键值数据,所以按上面所说,block-level碎片有细分为row-level碎片和Index Leaf Block-level 碎片。
oracle的每一个对象都是存储在segment中,而oracle的最小分配单位是extents (区),在数据更新删除中也会产生碎片这一级别的碎片就是segment碎片。
segment又存在datafile中,而tablespace又是包含datafile的逻辑概念。
所以这一层是tablespace-level碎片;tablespace是在disk上存储,所以这一层就是disk-level碎片。
简单图示如下disk-level fragme nti ontablespace-level fragme ntati onsegme nt-level fragme ntati onblock-level fragme ntati onrow-level fragme ntati onin dex leaf block-level fragme ntati on顺便提下oracle extents 存在的理由一个extents是由多个相连的block组成的,多个extents做成一个segment ;extent是oracle的最小分配单位extent的优点:1. 提高空间分配,释放的效率,降低管理block的资源成本2. 提高扫描的效率,因为extent是由相连blocks做成的特性,可以一次读取更多的内容,较低io读写次数extent的缺点容易产生碎片如何确定产生了碎片的呢?一。
一、概述数据库管理是企业信息系统中极为重要的一环,而Oracle数据库作为业界优秀的关系型数据库管理系统,通常被广泛应用于企业级应用中。
在数据库管理中,表空间是一个很重要的概念,它用于管理数据库中的数据存储。
随着数据量的增加,表空间可能会出现空间不足的情况,因此扩容表空间变得至关重要。
本文将介绍几种扩容Oracle数据库表空间的方法。
二、从数据文件角度扩容表空间1. 增加数据文件当表空间中的数据文件即将满的时候,可以通过增加数据文件的方式来扩容表空间。
具体操作步骤如下:1) 在Oracle数据库中使用“alter tablespace 表空间名 add datafile 新数据文件名 size 新数据文件大小”命令来增加数据文件;2) 通过以上操作,可以为表空间增加数据文件,并使表空间的空间得到扩容。
2. 自动扩展在表空间创建的时候,可以选择启用自动扩展功能。
当表空间中的数据文件空间不足时,可以自动扩展表空间的空间大小。
具体操作步骤如下:1) 在创建表空间的时候,使用“autoextend on”选项来启用自动扩展功能;2) 当表空间中的数据文件空间不足时,系统会自动扩展表空间的空间大小。
三、从段角度扩容表空间1. 移动段移动段是一种有效的扩容表空间的方法。
通过移动段,可以将表或索引从原有的表空间移动到具有足够空间的表空间中,从而实现表空间的扩容。
具体操作步骤如下:1) 使用“alter table 表名 move tablespace 新表空间名”命令来将表移动到新的表空间;2) 使用“alter index 索引名 rebuild tablespace 新表空间名”命令来将索引移动到新的表空间。
2. 压缩段通过压缩段的方式,可以释放表空间中的空闲空间,从而实现表空间的扩容。
具体操作步骤如下:1) 使用“alter table 表名enable row movement”命令来启用行移动功能;2) 使用“alter table 表名shrink spacepact”命令来压缩表,释放表空间中的空闲空间。
oracle数据库⾼⽔位线问题处理⼀、什么是⾼⽔线(High Water Mark)?Oracle 数据库在创建⼀张表时,会为这张表分配⼀个段空间(segment),为了⽅便理解,把段空间容纳数据的上限,称之为⾼⽔位线(HIGH WATER MARK) HWM ,HWM是⼀个标记,⽤来说明表⽰有多少未使⽤的块分配给这个段。
两个结论:1.⽔位线以上表⽰已经分配但还未使⽤块(block),⽔位先以下爱表⽰已经分配且已经使⽤过的块(包含了正在使⽤的块和使⽤过的且被删除了数据的空块)2.理论上来说,⼀张表的⽔位线只会增⼤不会减⼩(除⾮通过特殊的⽅法重置),即使将表中的数据全部删除,HWM还是为原值。
⼆、HWM数据库的操作有如下影响:a) 全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据。
b) 即使HWM以下有空闲的数据库块,键⼊在插⼊数据时使⽤了append关键字,HWM也会不断增⼤,占⽤系统资源,表所占的实际空间会不断增⼤,导致系统出现问题三、⾼⽔位线原因以及解决⽅法:产⽣原因:1.操作表时使⽤删除了⼤量数据。
2.在插⼊时使⽤了/append nologging/语句,append关键字会从为表分配段中的随机位置插⼊,⽔位线会不断增⾼。
3.Sql load 时默认使⽤truncate ⾃带了reuse storage参数,导致truncate以后⽔位线不会降低。
解决⽅法:1.直接truncate table drop storage2.建⽴⼀张维护表定期move并重建索引或者shrink space。
3.表数据落表时按照⽇期建⽴了备份表,保留⼀定天数数据4.Rename表名,重建表,重建索引,将数据导⼊重建表,drop原表,然后rename重建表为原表5.使⽤alter table 表名 shrink space(oracle10新增功能)6.在线表重定义(功能强⼤,操作复杂,⼀般不使⽤,可以改变表的结构)表重建的两个⽅法move与shrink的对⽐:move是oracle8出现的命令,使⽤时会创建⼀块和原来表空间相同⼤⼩的另⼀块表空间,然后进⾏数据的复制,完成后使⽤后表替换原表,解决hwm的问题。
都知道alter table move 或shrink space [ʃrɪŋk]可以收缩段,用来消除部分行迁移,消除空间碎片,使数据更紧密,但move跟shrink space还是有区别的。
Move会移动高水位,但不会释放申请的空间,是在高水位以下(below HWM)的操作。
而shrink space 同样会移动高水位,但也会释放申请的空间,是在高水位上下(below and above HWM)都有的操作。
Move解决问题: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的。
alter index index_name rebuild online;b.move时对table的锁定当我们对table进行move操作时,查询v$locked_objects视图可以发现,table 上加了exclusive lockc.关于move时空间使用的问题:当我们使用alter table move来降低table的HWM时,有一点是需要注意的,这时,当前的tablespace中需要有1倍于table的空闲空间以供使用Shrink space语法:alter table shrink space [ | compact | cascade ];alter table table_name shrink space compcat;收缩表,但会保持 high water mark;alter table table_name shrink space;收缩表,降低 high water mark;alter table table_name shrink space cascade;(cascade联接,串行)收缩表,降低 high water mark,并且相关索引也要收缩用shrink有两个前提条件:1、表必须启用row movement,如:alter table nonsrt.TAB_EZG_BIZ_UNCONTRACTED enable row movement; alter table nonsrt.TAB_EZG_BIZ_UNCONTRACTED shrink space;2、表段所在表空间的段空间管理(segment space management)必须为autosegment shrink分为两个阶段:1、数据重组(compact):通过一系列insert、delete操作,将数据尽量排列在段的前面。
Alter table move或者shrink space 可以收缩段,消除部分行迁移,消除空间碎片,使数据更紧密,但move跟shrink space还是有区别的。
Move会移动高水位,但不会释放申请的空间,是在HWM以下的操作。
Shrink space同样会移动hwm,但也会释放申请的空间,是在hwm上下都有的操作SQL> select * from v$version;BANNER----------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - ProdPL/SQL Release 10.2.0.4.0 - ProductionCORE 10.2.0.4.0 ProductionTNS for Linux: Version 10.2.0.4.0 - ProductionNLSRTL Version 10.2.0.4.0 - Production首先用alter table move方式创建测试表SQL> create table test(id number) storage(initial 10m next 1m) tablespace scott_test;Table created.SQL> analyze table test compute statistics;Table analyzed.SQL> col segment_name for a10SQL> select segment_name,extents,blocks,initial_extent/1024/1024 init from user_segments where segment_name='TEST';SEGMENT_NA EXTENTS BLOCKS INIT---------- ---------- ---------- ----------TEST 10 1280 10SQL> select table_name,blocks,empty_blocks from user_tables where2 table_name='TEST';TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST 0 1280SQL> begin2 for i in 1..100000 loop3 insert into test values(i);4 end loop;5 end;6 /SQL> analyze table test compute statistics;Table analyzed.SQL> select segment_name,extents,blocks from user_segments2 where segment_name='TEST';SEGMENT_NA EXTENTS BLOCKS---------- ---------- ----------TEST 10 1280SQL> select table_name,blocks,empty_blocks from user_tables where2 table_name='TEST';TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST 186 1094-- 插入10万行后,分配空间没变,分配的10个extents并未使用完,使用了186个blocks,空闲1094个blocks,此时hwm为186SQL> delete from test where rownum <=50000;50000 rows deleted.SQL> analyze table test compute statistics;Table analyzed.SQL> select segment_name,extents,blocks from user_segments where2 segment_name='TEST';SEGMENT_NA EXTENTS BLOCKS---------- ---------- ----------TEST 10 1280SQL> select table_name,blocks,empty_blocks from user_tables where2 table_name='TEST';TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST 186 1094SQL> select count(distinct dbms_rowid.rowid_block_number(rowid)) used_blocks from test;USED_BLOCKS-----------77--→删除一半数据后仍然使用186个blocks,而真正使用了77个blocks。
Hwm不变--SQL> alter table test move;Table altered.SQL> analyze table test compute statistics;Table analyzed.SQL> select table_name,blocks,empty_blocks from user_tables2 where table_name='TEST';TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST 81 1199SQL> select segment_name,extents,blocks from user_segments2 where segment_name='TEST';SEGMENT_NA EXTENTS BLOCKS---------- ---------- ----------TEST 10 1280--→move后,空闲块增加了,hwm降低了,但分配空间并没有降低。
使用alter table shrink space 方式SQL> create table test(id number) storage(initial 10m next 1m) tablespace scott_test;Table created.SQL> analyze table test compute statistics;Table analyzed.SQL> col segment_name for a10SQL> select segment_name,extents,blocks,initial_extent/1024/1024 init from user_segments where2 SQL> segment_name='TEST';SP2-0734: unknown command beginning "segment_na..." - rest of line ignored.SQL> select segment_name,extents,blocks,initial_extent/1024/1024 init from user_segments where2 segment_name='TEST';SEGMENT_NA EXTENTS BLOCKS INIT---------- ---------- ---------- ----------TEST 10 1280 10SQL> select table_name,blocks,empty_blocks from user_tables where2 table_name='TEST';TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST 0 1280SQL> begin2 for i in 1..100000 loop3 insert into test values(i);4 end loop;5 end;6 /PL/SQL procedure successfully completed.SQL> analyze table test compute statistics2 ;Table analyzed.SQL> select segment_name,extents,blocks from user_segments2 where segment_name='TEST';SEGMENT_NA EXTENTS BLOCKS---------- ---------- ----------TEST 10 1280SQL> select table_name,blocks,empty_blocks from user_tables2 where table_name='TEST';TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST 186 1094SQL> delete from test where rownum<=50000;50000 rows deleted.SQL> select segment_name,extents,blocks from user_segments2 where segment_name='TEST';SEGMENT_NA EXTENTS BLOCKS---------- ---------- ----------TEST 10 1280SQL> select table_name,blocks,empty_blocks from user_tables2 where table_name='TEST';TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST 186 1094SQL> select count(distinct dbms_rowid.rowid_block_number(rowid)) used_blocks from test;USED_BLOCKS-----------77SQL> alter table test enable row movement;Table altered.SQL> alter table test shrink space;Table altered.SQL> analyze table test compute statistics;Table analyzed.SQL> select segment_name,extents,blocks from user_segments2 where segment_name='TEST';SEGMENT_NA EXTENTS BLOCKS---------- ---------- ----------TEST 1 88SQL> select table_name,blocks,empty_blocks from user_tables2 where table_name='TEST';TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST 79 9--- 通过shrink space后,分配空间被压缩,hwm降低通过上面比较,move不算真正意义上的压缩空间,只会压缩HWM一下的空间,消除碎片。