zoukankan      html  css  js  c++  java
  • 表压缩及索引重建--分区表

    问题描述:将数据库中的大对象查出来,发现几张分区表比较大,对分区表进行处理,分区表压缩,分区表索引重建,数据文件resize

    1.查看表空间使用率

    SELECT Upper(F.TABLESPACE_NAME)         "表空间名",
           D.TOT_GROOTTE_MB                 "表空间大小(M)",
           D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
           To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99')
           || '%'                           "使用比",
           F.TOTAL_BYTES                    "空闲空间(M)",
           F.MAX_BYTES                      "最大块(M)"
    FROM   (SELECT TABLESPACE_NAME,
                   Round(Sum(BYTES) / ( 1024 * 1024 ), 2) TOTAL_BYTES,
                   Round(Max(BYTES) / ( 1024 * 1024 ), 2) MAX_BYTES
            FROM   SYS.DBA_FREE_SPACE
            GROUP  BY TABLESPACE_NAME) F,
           (SELECT DD.TABLESPACE_NAME,
                   Round(Sum(DD.BYTES) / ( 1024 * 1024 ), 2) TOT_GROOTTE_MB
            FROM   SYS.DBA_DATA_FILES DD
            GROUP  BY DD.TABLESPACE_NAME) D
    WHERE  D.TABLESPACE_NAME = F.TABLESPACE_NAME
    ORDER  BY 1

    2.查看数据文件大小

    SELECT tablespace_name, 
    file_id, 
    file_name, 
    round(bytes / (1024 * 1024), 0) total_space 
    FROM dba_data_files 
    ORDER BY tablespace_name;

    3.创建分区测试表

    create table test_partiton_02(
    number_1 number,
    number_2 number,
    string_1 varchar2(10),
    string_2 varchar2(20)
    ) partition by range(number_2)
    (
    partition p1 values less than (10000),
    partition p2 values less than (20000),
    partition p3 values less than (50000),
    partition p4 values less than (70000),
    partition p5 values less than (maxvalue)
    );

    4.创建本地分区索引

    CREATE INDEX ix_test_partiton_02_1 ON test_partiton_02(number_1) 
    local (PARTITION p1,
           PARTITION p2,
           PARTITION p3,
           PARTITION p4,
           PARTITION p5
           );--drop index ix_test_partiton_02_1;

    5.创建全局分区索引

    CREATE INDEX ix_test_partiton_02_2 ON test_partiton_02(number_2)
       GLOBAL PARTITION BY RANGE (number_2)
          (PARTITION p1 VALUES LESS THAN (10000),
           PARTITION p2 VALUES LESS THAN (55000),
           PARTITION p3 VALUES LESS THAN (MAXVALUE));

    6.写入测试数据

    insert into test_partiton_02(number_1,
                                  number_2,
                                  string_1,
                                  string_2)
    select dbms_random.random() as number_1,
           round(dbms_random.value(0, 100000)) as number_2,
           dbms_random.string(opt => 'A', len => 1) as String_1,
           dbms_random.string(opt => 'p', len => 10) as String_2
      from dual
    connect by rownum < 100001;
    commit;

    7.分析表

    analyze table test_partiton_02 compute statistics;

    8.查看分区表是否压缩,以及生成压缩语句

    select /*+parallel(4)*/ p.table_owner,p.table_name,p.partition_name,s.bytes/1024/1024/1024 gb,s.tablespace_name,p.compression,p.compress_for,p.partition_position,
    RANK() OVER(PARTITION BY TABLE_OWNER,TABLE_NAME ORDER BY PARTITION_POSITION DESC) rn,'alter table '||p.table_owner||'.'||p.table_name||' move partition '||p.partition_name||
    '  compress for oltp parallel 4;' from dba_tab_partitions p,dba_segments s where p.table_name=s.segment_name and p.table_owner=s.owner
    and p.partition_name=s.partition_name and s.SEGMENT_NAME='TEST_PARTITON_02';

    9.执行压缩语句

    alter table HZH.TEST_PARTITON_02 move partition P5  compress for oltp parallel 4;
    alter table HZH.TEST_PARTITON_02 move partition P4  compress for oltp parallel 4;
    alter table HZH.TEST_PARTITON_02 move partition P3  compress for oltp parallel 4;
    alter table HZH.TEST_PARTITON_02 move partition P2  compress for oltp parallel 4;
    alter table HZH.TEST_PARTITON_02 move partition P1  compress for oltp parallel 4;

    10.再次查看分区表压缩状态,已经可以看到压缩状态编程ENABLED,压缩方式为OLTP,语句见8

    11.查看分区索引是否有效

    ---查看分区索引是否 可用
    select index_owner,index_name,partition_name,subpartition_count,high_value,status from dba_ind_partitions t where t.INDEX_NAME in('IX_TEST_PARTITON_02_1','IX_TEST_PARTITON_02_2');

    12. 注意tablespace 的实际存储空间,生成索引重建语句

    select 'alter index '||p.owner||'.'||p.index_name||' rebuild partition '||i.partition_name||' tablespace HZH0528 parallel 4 online;',
    p.owner,p.table_name,p.index_name,p.alignment,i.partition_name,i.status,i.tablespace_name,i.logging,i.compression,i.last_analyzed from dba_part_indexes p,dba_ind_partitions i
    where p.index_name=i.index_name and p.owner=i.index_owner and p.owner='HZH' and i.status<>'USABLE' and p.table_name='TEST_PARTITON_02';

    13.重建索引,还需要注意关闭重建索引的并行

    alter index HZH.IX_TEST_PARTITON_02_1 rebuild partition P1 tablespace HZH0528 parallel 4 online;
    alter index HZH.IX_TEST_PARTITON_02_1 rebuild partition P2 tablespace HZH0528 parallel 4 online;
    alter index HZH.IX_TEST_PARTITON_02_1 rebuild partition P3 tablespace HZH0528 parallel 4 online;
    alter index HZH.IX_TEST_PARTITON_02_1 rebuild partition P4 tablespace HZH0528 parallel 4 online;
    alter index HZH.IX_TEST_PARTITON_02_1 rebuild partition P5 tablespace HZH0528 parallel 4 online;
    alter index HZH.IX_TEST_PARTITON_02_2 rebuild partition P1 tablespace HZH0528 parallel 4 online;
    alter index HZH.IX_TEST_PARTITON_02_2 rebuild partition P2 tablespace HZH0528 parallel 4 online;
    alter index HZH.IX_TEST_PARTITON_02_2 rebuild partition P3 tablespace HZH0528 parallel 4 online;
    alter index HZH.IX_TEST_PARTITON_02_2 noparallel;

    14.重新查看索引状态,状态已经变回usable,重建成功,如果需要重建索引时间较长,建议放在后台执行,要不然会话中断,再次重建会报错,比较麻烦

    ---查看分区索引是否 可用
    select index_owner,index_name,partition_name,subpartition_count,high_value,status from dba_ind_partitions t where t.INDEX_NAME in('IX_TEST_PARTITON_02_1','IX_TEST_PARTITON_02_2');

    15.做完表压缩和索引重建,就可以进行数据文件的收缩,如果表空间上T,而且数据文件就是几百个,不建议使用这个SQL,查询非常慢,可以手动指定resize的数据文件大小,如果压不了就报错,不会影响

    select a.file#,a.name,c.tablespace_name,round(a.bytes/1024/1024) CurrentMB,ceil(HWM *a.block_size)/1024/1024 ResizeTo,(a.bytes - HWM*a.block_size)/1024/1024 ReleaseMB,
    'alter database datafile ' || a.FILE# || ' resize ' ||round(ceil(HWM*a.block_size)/1024/1024+5)||'M;' ResizeCmd from v$datafile a,(SELECT file_id,MAX(block_id+blocks-1) HWM
    FROM DBA_EXTENTS GROUP BY file_id) b,dba_data_files c where a.file# = b.file_id(+) And (a.bytes - HWM * a.block_size) >0 and a.FILE#=c.file_id and c.tablespace_name='&tablespace_name'
     order by 6 desc;

    16.resize数据文件

    alter database datafile 8 resize 1142M;

    17.查看现在的表空间使用率,测试所用数据量较小,不太能体现压缩带来的数据变化,但是具体流程大体这样

    18.查看数据文件大小变化

    SELECT tablespace_name, 
    file_id, 
    file_name, 
    round(bytes / (1024 * 1024), 0) total_space 
    FROM dba_data_files 
    ORDER BY tablespace_name;

  • 相关阅读:
    mac下svn提交失败的解决方法
    mac终端下svn常用命令
    在Linux系统安装Nodejs 最简单步骤
    Cocos Creator学习笔记
    最好用的.NET敏捷开发框架-RDIFramework.NET V3.6版全新发布 100%源码授权
    史上最全面的SignalR系列教程-目录汇总
    RDIFramework.NET敏捷开发框架 ━ 工作流程组件介绍
    微信公众号开发系列-玩转微信开发-目录汇总
    RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.3版本全新发布
    RDIFramework.NET代码生成器全新V3.5版本发布-重大升级
  • 原文地址:https://www.cnblogs.com/houzhiheng/p/15029461.html
Copyright © 2011-2022 走看看