`
woody_woodpecker
  • 浏览: 19587 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Alter table move compress是如何工作的?(转)

阅读更多
alter table move compress的技术本质是通过在新的表空间或当前表空间中分配新的extents来存放压缩后的数据而实现的。而原来分配给该表的这些extents只释放供重用但不会被收缩(shrik high-water-mark).从这个角度来说,如果我们需要对一个大表做alter table move compress的动作的话,那么你就必须要确保目标表空间上存在额外的空间,从而保证这个动作的顺利执行.
下面通过看一个简单的测试就能明白这个基本原理了
测试环境:10.2.0.4,db_block_size=8K 表
首先,创建一个LMT+Uniform(1M)+MSSM的表空间,我这里叫LMT_UNIFORM_MSSM.
SQL> select a.tablespace_name,
2 a.file_name,
3 (b.maximum+c.blocks-1)*8192 highwater
4 from dba_data_files a,
5 (select file_id,max(block_id) maximum from dba_extents group by file_id) b,
6 dba_extents c
7 where a.file_id = b.file_id and
8 c.file_id = b.file_id and
9 c.block_id = b.maximum and
10 a.tablespace_name='LMT_UNIFORM_MSSM'
11 /

TABLESPACE_NAME FILE_NAME HIGHWATER
------------------ --------------- ----------
SQL>

可以看到这个时候,表空间LMT_UNIFORM_MSSM还是空的,没有任何对象。
创建一张普通表,放在表空间LMT_UNIFORM_MSSM,再看看LMT_UNIFORM_MSSM对应的datafile的highwater
SQL> create table zrp tablespace LMT_UNIFORM_MSSM as select * from dba_objects;
Table created
SQL> select segment_name,bytes from user_segments where segment_name='ZRP';
SEGMENT_NAME BYTES
---------------- -------
ZRP 6291456 <-6M
SQL>
SQL> select a.tablespace_name,
2 a.file_name,
3 (b.maximum+c.blocks-1)*8192 highwater
4 from dba_data_files a,
5 (select file_id,max(block_id) maximum from dba_extents group by file_id) b,
6 dba_extents c
7 where a.file_id = b.file_id and
8 c.file_id = b.file_id and
9 c.block_id = b.maximum and
10 a.tablespace_name='LMT_UNIFORM_MSSM'
11 /

TABLESPACE_NAME FILE_NAME HIGHWATER
------------------ ------------------------------------------------ ---------
LMT_UNIFORM_MSSM D:ORACLE10GORADATAORA10GLMT_UNIFORM_MSSM.DBF 6356992
SQL> select 6356992-6291456 from dual;
6356992-6291456
---------------
65536 <--LMT段头(64k)
SQL>
这个时候该对象占用了6M多(Uniform size=1M)的空间,对应的datafile的highwater也扩展到了6356992(6M+64K)
节下来对这张表ZRP进行move compress(在同一表空间内)
SQL> alter table zrp move compress;
Table altered
SQL>
SQL> select segment_name,bytes from user_segments where segment_name='ZRP';
SEGMENT_NAME BYTES
-------------- -------
ZRP 2097152
SQL>
可以看到,数据从原来的6个extents(6M)压缩到了2个extents(2M)。
看一下datafile的highwater是不是也降下来了?
SQL> select a.tablespace_name,
2 a.file_name,
3 (b.maximum+c.blocks-1)*8192 highwater
4 from dba_data_files a,
5 (select file_id,max(block_id) maximum from dba_extents group by file_id) b,
6 dba_extents c
7 where a.file_id = b.file_id and
8 c.file_id = b.file_id and
9 c.block_id = b.maximum and
10 a.tablespace_name='LMT_UNIFORM_MSSM'
11 /

TABLESPACE_NAME FILE_NAME HIGHWATER
------------------ ------------------------------------------------ ---------
LMT_UNIFORM_MSSM D:ORACLE10GORADATAORA10GLMT_UNIFORM_MSSM.DBF 8454144
SQL> select 8454144-6356992 from dual;
8454144-6356992
---------------
2097152
SQL>
正好是又在原来的datafile上又扩展了2个extents(2M).datafile上的highwater并没有降下来.
从下面的数据字典也可以看到,原来的那6个extent确实是空闲可以重新使用了.
SQL> select tablespace_name,file_id,block_id,bytes,blocks from dba_free_space where tablespace_name = 'LMT_UNIFORM_MSSM';
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS
------------------- ---------- ---------- ---------- -------
LMT_UNIFORM_MSSM 9 9 6291456 768
LMT_UNIFORM_MSSM 9 1033 1048576 128
SQL>
分享到:
评论

相关推荐

    Oracle 10gR2压缩(Compress)技术

    - 分区表压缩属性修改:使用ALTER TABLE ... MODIFY PARTITION ... COMPRESS/NOCOMPRESS命令。 - 分区索引压缩属性修改:对分区索引执行类似的修改操作。 - 分区表空间数据压缩:将数据移动到启用压缩的表空间中。 -...

    Oracle压缩表表空间

    SQL&gt; alter table tmp_test move compress; 同样,也可以使用 alter table.. move nocompress 来解压一个已经压缩的表: SQL&gt; alter tab tmp_test move nocompress; Oracle 压缩表表空间是一种高效的存储技术,...

    ORACLE的数据段压缩技术.doc

    SQL&gt; alter table T1 move compress; Table altered. ``` 对于分区表,由于其特殊的结构,不能直接对整个表执行 `MOVE COMPRESS` 操作。若需压缩分区表,需要逐个分区进行。以下是一个示例,假设我们有一个按时间...

    探讨Oracle表压缩技术及应用.pdf

    ALTER TABLE sale.detail_record MOVE COMPRESS; ``` 若要解除表的压缩,同时解压缩数据,可以执行: ```sql ALTER TABLE sale.detail_record MOVE NOCOMPRESS; ``` ### 压缩率测试 Oracle的表压缩技术能显著...

    oracle压缩.txt

    ALTER TABLE table_name MOVE PARTITION partition_name COMPRESS; -- 新旧数据均压缩 ``` 5. **在压缩表上添加和删除列** - 对于使用`BASIC`压缩级别的表,新增列时不能指定默认值: ```sql ALTER TABLE ...

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

    ALTER TABLE 表名 ADD (列说明列表) 例:为test表增加一列Age,用来存放年龄 sql&gt;alter table test add (Age number(3)); 修改基表列定义命令如下: ALTER TABLE 表名 MODIFY (列名 数据类型) 例:将test...

    Oracle Database 11g OLTP压缩总结

    3. **`ALTER TABLE...MOVE COMPRESS FOR OLTP`**: - 同样可以同时压缩现有的数据以及未来新增的数据。 - 在移动过程中,表会被加上排他锁(X锁),这意味着在此期间其他DML操作会被阻塞。 - 为了提高性能,可以...

Global site tag (gtag.js) - Google Analytics