注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

帅小伙的博客

希望能在这里交到更多的朋友

 
 
 

日志

 
 
 
 

shrink和move表空间的区别  

2008-01-23 18:17:28|  分类: oracle |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
alter table xxx shrink space 和 alter table xxx move

move命令是将数据从原来的段移到目标段的命令。

[move命令]
SQL> alter table emp move;

ORA-01652: unable to extend temp segment by 8 in tablespace AUTOSEG_TST

AUTOSEG_TST表空间没有足够的空闲空间。

SQL> select f.tablespace_name,d.file_name,f.bytes/1024 KBytes,f.blocks,d.autoextensible
     from dba_free_space f,dba_data_files d,dba_tables t
     where f.tablespace_name = d.tablespace_name
     and   f.tablespace_name = t.tablespace_name
     and   t.owner='SCOTT' and t.table_name='EMP';

TABLESPACE_NAME FILE_NAME                                 KBYTES  BLOCKS AUTOEXT
--------------- ---------------------------------------- ------- ------- -------
AUTOSEG_TST     /export/home/ora10g/oradata/AUTOSEG1.DBF      64       8 NO

[shrink命令]
即使对象所在表空间几乎没有空闲空间,shrink命令也能执行。
SQL> alter table emp shrink space;

Table altered.

# 差异点4. 不需要重建index

[move命令]
table具有主键index的时候,如果使用move命令就必须重建index。
SQL> alter table dept move;

Table altered.


SQL> select owner,index_name,status from dba_indexes where table_owner='SCOTT' 
and table_name='DEPT';

OWNER INDEX_NAME STATUS
----- ---------- --------
SCOTT PK_DEPT    UNUSABLE ←(不能使用index)


SQL> select /*+ index(dept pk_dept) */ * from dept  where rownum=1;

ORA-01502: index 'SCOTT.PK_DEPT' or partition of such index is in unusable state

执行move命令之后无法使用index,所以无法利用index查找。要解决这个问题让index恢复可以使用的状态,必须对index进行rebuild。
SQL> alter index pk_dept rebuild;

Index altered.


SQL> select /*+ index(dept pk_dept) */ * from dept where rownum=1;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK

[shirnk命令]
执行shrink命令的时候就不需要rebuild index。
SQL> alter table dept shrink space;

Table altered.


SQL> select /*+ index(dept pk_dept) */ * from dept where rownum=1;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK


SQL> select owner,index_name,status from dba_indexes where table_owner='SCOTT'
and table_name='DEPT';

OWNER INDEX_NAME STATUS
----- ---------- --------
SCOTT PK_DEPT    VALID   ←(index可以使用)

# 差异点5. cascade选项
前面用shrink命令让dept表缩小,cascade命令会让相关的pk_dept索引也同时缩小。

[shrink命令 -没有选项-]
--dept表shrink之前
SQL> select owner,segment_name,bytes,blocks,extents from dba_segments 
where segment_name = 'PK_DEPT';

OWNER SEGMENT_NAME      BYTES     BLOCKS    EXTENTS
----- ------------ ---------- ---------- ----------
SCOTT PK_DEPT        18874368       2304         33


SQL> alter table dept shrink space;

Table altered.

--dept表shrink之后
SQL> select owner,segment_name,bytes,blocks,extents from dba_segments 
where segment_name = 'PK_DEPT';

OWNER SEGMENT_NAME      BYTES     BLOCKS    EXTENTS
----- ------------ ---------- ---------- ----------
SCOTT PK_DEPT        18874368       2304         33

大家可以看到相关的pk_dept索引缩小了。

结论

我们已经针对Oracle 10g新功能shrink命令进行两次检验,主要都是介绍shrink命令的优点,下面追加相关限制事项。
1.无法解除行迁移
2.必须是local管理的自动段管理
3.不可以是下面的段:
-集群(cluster)、集群化表
-包含long列的物件
-LOB段
-包含函数索引(function index)的表

在我们的检验环境下,move命令的执行时间很短。所以,还是根据情况选择不同命令使用会比较好。这次就介绍到这里。
  评论这张
 
阅读(521)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018