Oracle高水位标记(HWM)(2)

SQL > ALTER TABLE table_name SHRINK SPACE COMPACT; --只压缩数据不下调HWM SQL > ALTER TABLE table_name SHRINK SPACE; --下调HWM

即该技术可以一次性压缩数据及下调HWM,也可以分两个阶段进行,第一阶段:在业务高峰,只压缩数据不下调HWM,第二阶段:在业务空闲时,下调HWM。

(5.2)MOVE Tablespace

语法为:

SQL > ALTER TABLE table_name MOVE TABLESPACE tablepsace_name;

需要注意:

--MOVE后不跟参数也行,不跟参数还是原来的表空间;

--MOVE后需要重建索引;

--如果以后还要网表里插入数据,没必要MOVE。MOVE释放出来的空间,只能这个表使用,其它的表或者segment无法使用。

(5.3)CTAS技术

即重建表技术。

 

SQL > CREATE TABLE new_table_name AS SELECT * FROM old_table_name; --将表的数据写入到一张新的表里 SQL > DROP TABLE old_table_name; --删除旧表 SQL > RENAME table new_table_name TO old_table_name --将新表名更改为旧表名

 

(5.4)EXP/IMP或EXPDP/IMPDP技术

与CTAS技术相当。

(5.5)DEALLOCATE技术

利用DEALLOCATE技术可以回收HWM以上从未使用过的数据块。语法如下

SQL > ALTER TABLE table_name DEALLOCATE UNUSED [KEEP integer]; --回收表段HWM以上的空间 SQL > ALTER INDEX index_name DEALLOCATE UNUSED [KEEP integer]; --回收索引段HWM以上的空间

(六)MOVE与SHRINK的区别

   

MOVE

 

SHRINK(仅对ASSM有效)

 

本质

 

move实际上是block级别的数据块拷贝,对表进行move后,该表所在blockid会发生改变数据的rowid自然也会发生改变,但是数据在table中的存储顺序并没有发生改变

 

shrink是对行数据进行移动。对表进行shrink后,部分行数据的rowid发生了变化,而table所位于的block区域的位置却没有发生变化。

 

重建索引

 

需要重建

 

可以通过cascade关键字重建

 

 

TM(exclusive)

 

TM(SX)

 

空间要求

 

需要有原表大的空闲空间

 

不需要额外的空间

 

效果

 

压缩后会回收空间

 

压缩后会回收空间

 

详细例子见下面测试。

  (七)高水位问题测试

(8.1)测试目的:

1.了解Oracle统计信息的概念;

2.测试使用delete与truncate删除数据对HWM的影响[主要目的]

(8.2)主要步骤

(1)创建表test01

create table test01 ( id number, name varchar(15) );

这个时候,去查看表与段的参数

 

SQL> select 2 dt.table_name, 3 dt.blocks, 4 dt.empty_blocks 5 from 6 dba_tables dt 7 where 8 dt.table_name = 'TEST01'; TABLE_NAME BLOCKS EMPTY_BLOCKS ------------------------------ ---------- ------------ TEST01 0 0 SQL> SQL> select 2 ds.segment_name, 3 ds.segment_type, 4 ds.header_file, 5 ds.header_block, 6 ds.bytes, 7 ds.blocks, 8 ds.extents 9 from 10 dba_segments ds 11 where 12 ds.segment_name = 'TEST01'; SEGMENT_NAME SEGMENT_TYPE HEADER_FILE HEADER_BLOCK BYTES BLOCKS EXTENTS ------------- ------------------ ----------- ------------ ---------- ---------- ---------- SQL> exec dbms_stats.gather_table_stats('LIJIAMAN','TEST01'); PL/SQL procedure successfully completed SQL> SQL> select 2 dt.table_name, 3 dt.blocks, 4 dt.empty_blocks 5 from 6 dba_tables dt 7 where 8 dt.table_name = 'TEST01'; TABLE_NAME BLOCKS EMPTY_BLOCKS ------------------------------ ---------- ------------ TEST01 0 0 SQL> SQL> select 2 ds.segment_name, 3 ds.segment_type, 4 ds.header_file, 5 ds.header_block, 6 ds.bytes, 7 ds.blocks, 8 ds.extents 9 from 10 dba_segments ds 11 where 12 ds.segment_name = 'TEST01'; SEGMENT_NAME SEGMENT_TYPE HEADER_FILE HEADER_BLOCK BYTES BLOCKS EXTENTS ------------- ------------- ----------- ------------ ---------- ---------- ----------  

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f9332e94ed5ce2dc99367288843e897c.html