`

ORACLE 10g和11g压缩分区表操作脚本

 
阅读更多

对于OLAP系统,数据量特别大,而且不能随便扩空间,所以压缩也是比较好的方法,压缩比基本是:1:2

下面是压缩脚本,需要先创建log,记录压缩到哪张表的日志。

下面的例子是 ORACLE  11g的

-- Create table

create table TL_COMPRESS_LOG

(

  OWNNAME  VARCHAR2(30),

  TABNAME  VARCHAR2(30),

  SUBPARNAME VARCHAR2(30),

  TSNAME   VARCHAR2(30),

  BEGTIME  DATE,

  ENDTIME  DATE,

  OLD_MB   NUMBER,

  NEW_MB   NUMBER,

  OLD_ROWS NUMBER,

  NEW_ROWS NUMBER

)

tablespace USERS;

-- Add comments to the table 

comment on table TL_COMPRESS_LOG

  is '压缩日志表';

-- Add comments to the columns 

comment on column TL_COMPRESS_LOG.OWNNAME

  is '属主';

comment on column TL_COMPRESS_LOG.TABNAME

  is '表';

comment on column TL_COMPRESS_LOG.SUBPARNAME

  is '子分区';

comment on column TL_COMPRESS_LOG.TSNAME

  is '表空间';

comment on column TL_COMPRESS_LOG.BEGTIME

  is '压缩开始时间';

comment on column TL_COMPRESS_LOG.ENDTIME

  is '压缩结束时间';

comment on column TL_COMPRESS_LOG.OLD_MB

  is '压缩前大小(MB)';

comment on column TL_COMPRESS_LOG.NEW_MB

  is '压缩后大小(MB)';

comment on column TL_COMPRESS_LOG.OLD_ROWS

  is '压缩前记录数';

comment on column TL_COMPRESS_LOG.NEW_ROWS

  is '压缩后记录数';

 

 

 

 

DECLARE

  VT1 DATE;

  VT2 DATE;

  VM1 NUMBER;

  VM2 NUMBER;

  VR1 NUMBER;

  VR2 NUMBER;

BEGIN

  FOR C IN (SELECT '用户名' OWNNAME,

                   TABLE_NAME TABNAME,

                   PARTITION_NAME PARNAME,

                   SUBPARTITION_NAME SUBPARNAME,

                   TABLESPACE_NAME TSNAME

              FROM USER_TAB_SUBPARTITIONS

             WHERE TABLE_NAME LIKE 'TM_%201208'

               AND COMPRESSION != 'ENABLED'

             ORDER BY TABLE_NAME, PARTITION_NAME ,SUBPARTITION_NAME) LOOP

    VT1 := SYSDATE;

    SELECT MAX(BYTES) / 1024 / 1024

      INTO VM1

      FROM DBA_SEGMENTS

     WHERE OWNER = C.OWNNAME

       AND SEGMENT_NAME = C.TABNAME

       AND PARTITION_NAME = C.SUBPARNAME;

    EXECUTE IMMEDIATE 'select /*+ parallel(t,4) */ count(*) from

' || C.TABNAME || ' subpartition (' || C.SUBPARNAME || ') t'

      INTO VR1;

    INSERT INTO TL_COMPRESS_LOG

    VALUES

      (C.OWNNAME,

       C.TABNAME,

       C.PARNAME,

       C.TSNAME,

       VT1,

       NULL,

       VM1,

       NULL,

       VR1,

       NULL);

    --

    EXECUTE IMMEDIATE 'alter table ' || C.TABNAME || ' move subpartition

' || C.SUBPARNAME || ' compress tablespace ' || C.TSNAME;

    --

    VT2 := SYSDATE;

    SELECT MAX(BYTES) / 1024 / 1024

      INTO VM2

      FROM DBA_SEGMENTS

     WHERE OWNER = C.OWNNAME

       AND SEGMENT_NAME = C.TABNAME

       AND PARTITION_NAME = C.SUBPARNAME;

    EXECUTE IMMEDIATE 'select /*+ parallel(t,4) */ count(*) from

' || C.TABNAME || ' subpartition (' || C.SUBPARNAME || ') t'

      INTO VR2;

    UPDATE TL_COMPRESS_LOG

       SET ENDTIME = VT2, NEW_MB = VM2, NEW_ROWS = VR2

     WHERE OWNNAME = C.OWNNAME

       AND TABNAME = C.TABNAME

       AND SUBPARNAME= C.PARNAME;

  END LOOP;

END;

--由于ORACLE 10g不支持直接对子分区进行压缩,所以需要对主分区进行压缩如下:

--ORACLE 10g

DECLARE

  VT1 DATE;

  VT2 DATE;

  VM1 NUMBER;

  VM2 NUMBER;

  VR1 NUMBER;

  VR2 NUMBER;

BEGIN

  FOR C IN (SELECT 'CTMX' OWNNAME,table_name TABNAME,partition_name PARNAME,

           TABLESPACE_NAME TSNAME FROM 

           user_tab_partitions WHERE table_name LIKE '%201303' 

           AND compression='DISABLED') LOOP

    VT1 := SYSDATE;

    SELECT MAX(BYTES) / 1024 / 1024

      INTO VM1

      FROM DBA_SEGMENTS

     WHERE OWNER = C.OWNNAME

       AND SEGMENT_NAME = C.TABNAME

       AND PARTITION_NAME = C.PARNAME;

    EXECUTE IMMEDIATE 'select /*+ parallel(t,4) */ count(*) from

' || C.TABNAME || ' partition (' || C.PARNAME || ') t'

      INTO VR1;

    INSERT INTO TL_COMPRESS_LOG

    VALUES

      (C.OWNNAME,

       C.TABNAME,

       C.PARNAME,

       C.TSNAME,

       VT1,

       NULL,

       VM1,

       NULL,

       VR1,

       NULL);

    --

    EXECUTE IMMEDIATE 'alter table ' || C.TABNAME || ' move partition  

' || C.PARNAME ||' compress' ;

    --

    VT2 := SYSDATE;

    SELECT MAX(BYTES) / 1024 / 1024

      INTO VM2

      FROM DBA_SEGMENTS

     WHERE OWNER = C.OWNNAME

       AND SEGMENT_NAME = C.TABNAME

       AND PARTITION_NAME = C.PARNAME;

    EXECUTE IMMEDIATE 'select /*+ parallel(t,4) */ count(*) from

' || C.TABNAME || ' partition (' || C.PARNAME || ') t'

      INTO VR2;

    UPDATE TL_COMPRESS_LOG

       SET ENDTIME = VT2, NEW_MB = VM2, NEW_ROWS = VR2

     WHERE OWNNAME = C.OWNNAME

       AND TABNAME = C.TABNAME

       AND SUBPARNAME= C.PARNAME;

  END LOOP;

END;

分享到:
评论
1 楼 cvics_ailk 2014-03-05  
挺好的,挺实用的,希望楼主多共享一些好东西

相关推荐

    oracle自动建立表分区脚本

    7. **脚本使用说明**:通常,该脚本会包含SQL语句,用于创建分区表和定义分区策略。DBA需要根据实际业务需求,调整脚本中的参数,如分区字段、分区数量、分区边界等。 8. **注意事项**:在使用自动分区脚本时,需...

    Oracle 11g

    Oracle 11g是Oracle公司推出的数据库管理系统的一个重要版本,它在11g系列中包含了多个方面的改进和增强,旨在提供...通过学习和运行这些源代码,你可以深入理解Oracle 11g的核心特性和操作方法,提升数据库管理技能。

    oracle 普通表转分区表方式

    本文详细介绍了将 Oracle 普通表转换为分区表的方法,包括备份创建表脚本、查看数据类型、创建分区表、迁移数据和更新索引和约束等步骤。通过将普通表转换为分区表,可以提高查询效率、减少存储空间和提高数据管理...

    oracle 11g 官方演示模式store sql 脚本

    在Oracle 11g中,SQL不仅可以进行基本的数据操作,还可以用于创建和管理表、视图、索引、存储过程、触发器等数据库对象。此外,Oracle 11g支持PL/SQL,这是一种过程化的SQL扩展,允许编写包含控制流语句、子程序和...

    Oracle11g R2 64位

    它在Oracle11g R1的基础上进行了大量的改进和优化,提供了更多的功能和更强大的性能支持。特别地,64位版本为企业级应用提供了更高的性能、更大的内存支持以及更强的数据处理能力。 #### 二、Oracle11g R2的关键...

    Oracle 11G- SQL

    1. **分区技术**:Oracle 11G 支持多种分区策略,如范围分区、列表分区和哈希分区,这些特性可以显著提高大型表的查询性能。 2. **压缩技术**:通过压缩表和索引,减少存储空间的使用,同时还可以加快查询速度。 3. ...

    windows本地 Oracle 11g安装完整教程 - Evernote.pdf

    根据提供的文件信息,本教程主要讲解在Windows操作系统上安装Oracle 11...此外,Oracle 11g安装过程中还会涉及到许多细节操作,这里只列举了主要步骤和常见问题,实际操作中需要严格遵循Oracle官方提供的安装指南进行。

    Oracle学习与Oracle11g

    在Oracle 11g中,分区功能得到了进一步的增强,包括对分区表的支持更为完善,允许对现有分区进行动态调整,以及提供了更多的分区策略,如列表分区和范围分区的组合使用,这为大型数据集的管理和查询效率提升提供了更...

    [oracle数据库11G初学者指南]

    - **数据仓库优化**:通过引入新的分区策略和压缩技术,Oracle 11G提高了数据仓库的性能和效率。 - **安全性和隐私保护**:增加了多项安全特性,如透明数据加密、细粒度访问控制等,增强了数据的安全性和隐私保护。 ...

    oracle自动一年建立表分区.zip

    在Oracle数据库系统中,表分区是一种高级特性,用于提高数据管理效率、提升查询性能和简化维护工作。"Oracle自动一年建立表分区.zip"文件显然包含了用于自动创建按时间(一年)分区的Oracle脚本。这样的脚本对于处理...

    ORACLE表空间的回收脚本.rar

    - `ORACLE表空间的回收脚本.sql`很可能是执行上述操作的SQL命令集合。例如,它可能包括以下内容: - `ALTER TABLE ... COMPRESS FOR OLTP;` 对表进行OLTP压缩。 - `DBMS_SPACE_ADMIN.UNUSED_SPACE.FREE;` 释放表...

    Oracle10g数据库管理与应用系统开发光盘.rar

    1. **分区技术**:10g支持多种分区策略,如范围分区、列表分区、哈希分区和组合分区,帮助优化大型表的性能和管理。 2. **物质化视图**:物质化视图有助于提高查询性能,尤其是当数据来自多个表或者需要复杂计算时...

    【Oracle-RAC】Linux--Oracle-11g-R2-RAC-安装配置详细过程V3.0(图文并茂)

    根据提供的文档信息,本文将详细解析Oracle 11g R2 RAC(Real Application Clusters)在Linux环境下的安装配置过程。此文档适用于希望在Linux平台上部署Oracle 11g R2 RAC集群的IT专业人士。 ### Oracle 11g R2 RAC...

    oracle高效设计脚本

    1. 表分区:对大表进行分区可以显著提升查询速度,如范围分区、列表分区、哈希分区等。 2. ROWIDs定位:理解ROWIDs的结构,能快速定位到数据行,提高查询速度。 3. 压缩选项:Oracle提供了不同级别的数据压缩,如...

    oracle数据库备份脚本

    `expdp` 支持多种数据导出方式,包括表、表空间、用户等,并且支持压缩、分区等功能。 ##### 3.2 常用参数 - **directory**:指定存放备份文件的位置。 - **schemas**:指定要备份的模式。 - **tables**:指定要...

    安装Oracle11G软件和创建数据库文档

    1. 检查系统环境:安装Oracle数据库之前需要确保硬件和操作系统环境满足Oracle官方的最小系统要求。硬件包括足够的CPU、内存以及足够的磁盘空间。而操作系统则需要安装好所有必要的补丁。 2. 创建虚拟机:由于提到...

    PostgreSQL 8.2,Oracle 10g,SQL Server 2005,MYSQL 5.1 脚本例子

    标题 "PostgreSQL 8.2,Oracle 10g,SQL Server 2005,MYSQL 5.1 脚本例子" 提供了关于四个不同数据库管理系统(DBMS)——PostgreSQL 8.2、Oracle 10g、SQL Server 2005 和 MySQL 5.1 的SQL脚本示例。这些脚本通常用于...

    Oracle10g_学习笔记.zip

    3. 数据库分区:Oracle 10g支持范围、列表、哈希等多种分区方式,提高大型表的查询性能。 4. Advanced Compression:提供了行级和列级压缩,减少存储需求,提升I/O效率。 5. 数据仓库优化:支持并行查询优化,提升...

Global site tag (gtag.js) - Google Analytics