`
woody_woodpecker
  • 浏览: 19102 次
  • 性别: 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>
分享到:
评论

相关推荐

    alter table move相关知识研究

    在数据库管理领域,`ALTER TABLE MOVE` 是一个重要的SQL命令,用于重定义或移动表的存储位置,以优化表的物理结构或者调整表空间。这个操作通常涉及到将表的数据从一个段(segment)移动到另一个段,或者改变表的...

    Oracle 10gR2压缩(Compress)技术

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

    SQL Server中alter table一些用法.doc

    SQL Server 中 Alter Table 的一些用法 SQL Server 中 Alter Table 语句的主要作用是对已经创建的表进行修改、添加、删除约束、修改表结构等操作。下面是 Alter Table 语句的一些用法: 添加约束 Alter Table ...

    ALTER TABLE table_name

    ### ALTER TABLE 语句在Oracle中的应用 #### 标题:ALTER TABLE table_name - **知识点**:在数据库管理系统(DBMS)中,`ALTER TABLE` 是一种用于修改已存在表结构的 SQL 语句。这包括添加、删除或修改列、约束等...

    alter table test rename test1; --修改表名alter table test add colum

    ### MySQL ALTER TABLE 语法与应用详解 #### 一、概述 在MySQL中,`ALTER TABLE`语句是一种非常实用的工具,它允许用户修改现有表的结构,包括但不限于添加、删除或修改列、更改表名以及调整表的存储引擎等。这种...

    修改表 1、添加字段: alter table 表名add column 字段名 数据类型 位置 ; 2、删除字段: a

    在MySQL数据库管理系统中,`ALTER TABLE`语句是用于修改已存在的表结构的关键命令。本文将详细阐述如何使用`ALTER TABLE`来执行各种操作,包括添加字段、删除字段、修改字段、改变字段数据类型、更改表引擎、重命名...

    alter table 2.zip_ALTER_Table_csharp_sql

    这个"ALTER TABLE 2.zip_ALTER_Table_csharp_sql"主题可能涵盖了如何在C#编程中与SQL Server交互,执行`ALTER TABLE`命令来更新或调整现有表格的定义。下面我们将深入探讨`ALTER TABLE`语句的基本用法以及在C#中执行...

    SQL中的ALTER TABLE语句详解.pdf

    ### SQL中的ALTER TABLE语句详解 #### 一、概述 在数据库管理中,经常会遇到需要对已有的表结构进行修改的情况。例如,可能需要添加新的字段、修改字段的数据类型、删除不再使用的字段或者更改索引等。这时就需要...

    MySQL Alter Table 修改表信息.docx

    MySQL Alter Table 修改表信息 MySQL Alter Table 语句是一种 poderosa 语句,允许用户修改表信息,包括增加或删减字段、更改字段的数据类型和属性、创建或取消索引、修改表的评注和表的类型等。 增加字段 ALTER ...

    alter sql 语句实例

    例如:ALTER TABLE table_name ALTER COLUMN column_name TYPE new_type; 4. SET/DROP DEFAULT:为一个字段设置或删除缺省值。缺省值只应用于随后的 INSERT 命令。 例如:ALTER TABLE table_name ALTER COLUMN ...

    mysql alter table命令修改表结构实例详解

    mysql alter table语句可以修改表的基本结构,例如添加字段、删除字段、添加主键、添加索引、修改字段数据类型、对表重命名等等操作,本文章通过两个简单的实例向大家介绍mysql alter table的使用方法。  实例一:...

    mysql alter table 修改表命令详细介绍

    MySQL的`ALTER TABLE`命令是数据库管理中不可或缺的一部分,它允许用户在不丢失已有数据的情况下,对表结构进行各种修改。本文将深入探讨`ALTER TABLE`的使用,包括添加、修改和删除字段、索引、主键等操作,并通过...

    Alter-Table.rar_Table

    在数据库管理中,`ALTER TABLE` 和 `CREATE TABLE` 是两个非常重要的SQL语句,用于对已有表格结构进行修改和创建新的表格结构。在Access和VB6(Visual Basic 6)环境中,这些功能同样得到支持,尽管它们可能具有与...

    mysql alter table命令修改表结构实例

    mysql实例之使用alter table命令修改表结构 mysql alter table语句可以修改表的基本结构,例如添加字段、删除字段、添加主键、添加索引、修改字段数据类型、对表重命名等等操作,本文章通过两个简单的实例向大家介绍...

    ectouch企业版20150101整包,带微信通,微信支付

    ALTER TABLE `ecs_brand` ADD COLUMN `brand_banner` VARCHAR(80) NOT NULL COMMENT '商品品牌banner'; ALTER TABLE `ecs_goods` ADD COLUMN `sales_count` int(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `click_...

    mysql alter table修改表命令整理

    MYSQL ALTER TABLE命令用于修改表结构,例如添加/修改/删除字段、索引、主键等等,本文章通过实例向大家介绍MYSQL ALTER TABLE语句的使用方法,  MySQL ALTER语法如下: ALTER [IGNORE] TABLE tbl_name alter_spec...

    alter提升各种数据库脚本的方法

    - **SQL Server:** `ALTER TABLE table_name ALTER COLUMN column_name new_data_type [NULL | NOT NULL];` - **Oracle:** `ALTER TABLE table_name MODIFY (column_name new_data_type [NULL | NOT NULL]);` **...

    MySQL中的alter table命令的基本使用方法及提速优化

    alter table tbl_name add col_name type 例如, 给pet的表增加一列 weight, mysql&gt;alter table pet add weight int; 2. 删除列 alter table tbl_name drop col_name 例如, 删除pet表中的weight这一列 mysql&gt;...

Global site tag (gtag.js) - Google Analytics