`

shrink和move表空间的区别

阅读更多

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命令的执行时间很短。所以,还是根据情况选择不同命令使用会比较好。这次就介绍到这里。

分享到:
评论

相关推荐

    Oracle碎片整理

    本文将深入探讨Oracle中的碎片整理,主要关注`ALTER TABLE T MOVE`和`ALTER TABLE T SHRINK SPACE`两个命令。 首先,我们来理解什么是Oracle数据库中的碎片。碎片分为两种类型:内部碎片和外部碎片。内部碎片是指...

    Oracle数据库整理表碎片

    - 不需要额外的空闲空间,而ALTER TABLE MOVE通常需要与当前表一样大小的空闲空间。 总之,合理地整理表碎片不仅可以提高数据库的整体性能,还能有效减少资源浪费。在实践中,根据具体情况选择合适的整理方法尤为...

    浅谈清理表空间

    清理表空间方法有好多,可以move,可以shrink,可以导出导入,也可以建临时表,当然还有在线重定义。具体怎么做,以及各种方法的优劣,很多博客的文章都说了,我就不做复制粘贴了。 重点想说一下实际情况应用处理...

    高水位(High_Water_Mark)的概念及高水位问题的解决

    1. **SHRINK SPACE**:除了用于解决性能问题外,还可以使用`SHRINK SPACE`来回收未使用的空间,减少表的存储需求。 ```sql ALTER TABLE table_name SHRINK SPACE COMPACT; ``` 2. **REORGANIZE**:通过重新...

    oracle 命令大全.doc

    通过 `ALTER DATABASE DATAFILE SHRINK SPACE` 或 `ALTER TABLE MOVE` 可以减少表空间占用的空间。 5. **设置表空间为只读或只写**: `ALTER TABLESPACE SET READ ONLY` 或 `ALTER TABLESPACE SET READ WRITE` ...

    oracle高水位.txt

    - **存储浪费**:如果表中存在大量的删除和更新操作,那么高水位线以下的空间可能会被标记为已使用但实际上是空闲的,这将导致存储资源的浪费。 ### Oracle高水位处理脚本分析 #### 脚本解读 1. **分析表统计信息*...

    Oracle降低高水位的方法

    例如,如果一个表最初有很多数据,后来进行了大量删除操作,那么这部分未使用的空间虽然被标记为可重用,但仍然占据着表的存储空间,这会导致表占用的物理空间远大于实际存储的数据量,从而造成空间的浪费。...

    Oracle 10g HWM原理及性能优化

    Oracle的存储结构由块(Block)、区(Extent)、段(Segment)和表空间(Tablespace)组成。块是最小的存储单元,通常为8KB,区是由连续块组成的,用于扩展存储空间。段由一系列区构成,每个对象(如表或索引)都有自己的段...

    如何保持Oracle数据库优良性能

    MOVE PARTITION`可以在不同表空间之间移动分区。 - **修改分区**:使用`ALTER TABLE ... SPLIT PARTITION`来分裂一个分区成两个。 - **重命名分区**:通过`ALTER TABLE ... RENAME PARTITION`更改分区名称。 - **...

    Oracle19c数据库高水位线(HWM)详解与操作指南

    最后,给出了几种降低 HWM 的方法,包括 alter table move、shrink space、数据复制、exp/imp 以及 deallocate unused 等方法。 适合人群:具备 Oracle 数据库基础的数据库管理员和技术人员。 使用场景及目标:帮助...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     16.2.6 理解std::move 610  16.2.7 转发 612  16.3 重载与模板 614  16.4 可变参数模板 618  16.4.1 编写可变参数函数模板 620  16.4.2 包扩展 621  16.4.3 转发参数包 622  16.5 模板特例化 624  小结 ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     16.2.6 理解std::move 610  16.2.7 转发 612  16.3 重载与模板 614  16.4 可变参数模板 618  16.4.1 编写可变参数函数模板 620  16.4.2 包扩展 621  16.4.3 转发参数包 622  16.5 模板特例化 624  小结 ...

    Oracle数据文件收缩实例

    FreeList是Oracle用于管理空闲块的数据结构,它跟踪在表段中未分配的空闲空间。当一个事务删除数据时,这些块并不会立即被回收,而是被添加到FreeList中供后续插入操作使用。FreeList的管理对于OLTP(Online ...

    The Linux Kernel API

    在Linux操作系统中,VFS(Virtual File System)是内核的核心组成部分之一,它为各种不同的文件系统提供了一个统一的接口,使得用户空间的应用程序可以不关心底层文件系统的具体实现,而能够一致地访问文件和目录。...

    Linux内核API手册

    - `d_move`:移动目录项。 - `__d_path`:获取目录路径。 - `is_subdir`:检查是否为子目录。 - `find_inode_number`:查找inode编号。 - `d_drop`:丢弃目录项。 - `d_add`:添加目录项。 - `dget`:增加目录项的...

    最全的oracle常用命令大全.txt

    例:表删除将同时删除表的数据和表的定义 sql>drop table test c、表空间的创建、删除 六、ORACLE逻辑备份的SH文件 完全备份的SH文件:exp_comp.sh rq=` date +"%m%d" ` su - oracle -c "exp system/manager ...

    LINUX_API大全

    - **d_move**:移动目录项到另一个目录。 - **__d_path**:构造路径名。 - **is_subdir**:判断一个目录是否为另一个目录的子目录。 - **find_inode_number**:查找inode编号。 - **d_drop**:释放目录项。 - ...

    C++ Standard Library Practical Tips.doc

    使用`std::merge`或`std::move`。 #### TIP 11: 交换容器 使用`std::swap`函数。 #### TIP 12: 获取容器的大小和最大大小 调用`size()`和`max_size()`成员函数。 #### TIP 13: 比较容器的大小 使用`std::greater_...

    LINUX API 大全

    - **`d_move()`**:移动目录项到新的位置。 - **`__d_path()`**:构建路径名。 - **`is_subdir()`**:判断是否为子目录。 - **`find_inode_number()`**:查找inode编号。 - **`d_drop()`**:删除一个目录项。 - **`d...

Global site tag (gtag.js) - Google Analytics