表压缩及索引重建--分区表
问题描述:将数据库中的大对象查出来,发现几张分区表比较大,对分区表进行处理,分区表压缩,分区表索引重建,数据文件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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署