段收缩的方法

来源:互联网 发布:m18无后坐力炮数据 编辑:程序博客网 时间:2024/04/28 19:13


如何体现表的水位线呢?oracle没有这样的参数,可以通过表里面的行所占的数据块(blocks)来间接反映


SQL> create table hr.huang as select * from dba_objects; 用sys用户给hr创建一张表

切换到hr用户

SQL> select TABLE_NAME,NUM_ROWS ,BLOCKS from user_tables;


TABLE_NAME                       NUM_ROWS     BLOCKS
------------------------------ ---------- ----------
HUANG
T4                                    107          5
T3                                    107          4


我们可以看到,新建的表没有 NUM_ROWS   , BLOCKS这两个值,数据库每一天在某个点会做一次这样的检测。我们现在手工生成这样的值:
SQL> exec dbms_stats.gather_table_stats(user,'HUANG',cascade=>true);


PL/SQL procedure successfully completed.


SQL> select TABLE_NAME,NUM_ROWS ,BLOCKS from user_tables;


TABLE_NAME                       NUM_ROWS     BLOCKS
------------------------------ ---------- ----------
HUANG                               50440        713
T4                                    107          5
T3                                    107          4

现在 NUM_ROWS     BLOCKS有值了。


SQL> delete huang where rownum < 30000;


29999 rows deleted.


SQL> exec dbms_stats.gather_table_stats(user,'HUANG',cascade=>true);


PL/SQL procedure successfully completed.


SQL>  select TABLE_NAME,NUM_ROWS ,BLOCKS from user_tables;


TABLE_NAME                       NUM_ROWS     BLOCKS
------------------------------ ---------- ----------
HUANG                               20441        713
T4                                    107          5
T3                                    107          4

手动删除近30000行,然后说动修改表的属性,可以看到NUM_ROWS变了,但是BLOCKS没变,说明高水位线没有移动。

我们现在用下面的方法来移动


1、move

SQL> alter table huang move 

SQL> exec dbms_stats.gather_table_stats(user,'HUANG',cascade=>true);(cascade=>true 是赋值的意思

SQL> select TABLE_NAME,NUM_ROWS ,BLOCKS from user_tables;


TABLE_NAME                       NUM_ROWS     BLOCKS
------------------------------ ---------- ----------
LOCATIONS                              23          5
HUANG                               20441        298
T2                                      0          0

可以看到,BLOCKS变小了,说明水位线移动了。


2、shrink

前提条件:表所在的表空间必须使用ASSM(表空间使用local管理,段使用auto管理),开启行移动属性。

查看HR默认表空间:

SQL> select USERNAME,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE          
  2  from user_users
  3  where username='HR';


USERNAME                       DEFAULT_TABLESPACE
------------------------------ ------------------------------
TEMPORARY_TABLESPACE
------------------------------
HR                             USERS
TEMP


查看表空间的管理方式:

SQL> select TABLESPACE_NAME,EXTENT_MANAGEMENT,SEGMENT_SPACE_MANAGEMENT from user_tablespaces;


TABLESPACE_NAME                EXTENT_MAN SEGMEN
------------------------------ ---------- ------

USERS                          LOCAL      AUTO

条件是符合的,开始移动水位线吧:

分为压缩和降低HWM,压缩阶段可以进行DML,降低HWD阶段需要加上排它锁。两个阶段可以分开进行:


SQL> alter table huang shrink space;
alter table huang shrink space
*
ERROR at line 1:
ORA-10636: ROW MOVEMENT is not enabled

未开启行移动的情况下进行shrink会报错。


开启行移动:

SQL> alter table huang enable row movement;

SQL> alter table huang shrink space compact; (压缩表)

SQL> alter table huang shrink space ; (移动水位线)

SQL> exec dbms_stats.gather_table_stats(user,'HUANG',cascade=>true);



PL/SQL procedure successfully completed.


SQL> select TABLE_NAME,NUM_ROWS ,BLOCKS from user_tables;


TABLE_NAME                       NUM_ROWS     BLOCKS
------------------------------ ---------- ----------
HUANG                               20441        256
T4                                    107          5

可以看到水位线往上移动了。