迁移方案7-Oracle数据迁移1—一张7.5亿行的表(没有做分区,没有优化索引)进行优化测试,并用最短停机窗口迁移到新分区表—步骤1—测试计划
一、问题查看
1、查看当前用户下,根据表的大小进行排序
select table_name,tablespace_name,num_rows,blocks,pct_free,pct_used from user_tables where num_rows is not null order by num_rows desc;
大约有7亿3千万行(未做最新统计信息)。
2、查看此表和索引总和约500G
(1)查看索引数
select index_name from user_indexes where table_name='SFC_BROOKNER_PARAM_LOG';
(2)查看表和索引的总大小(约500G)
select bytes/1024/1024/1024 from user_segments where segment_name in('SFC_BROOKNER_PARAM_LOG','IDX_SFC_BROOKNER_PARAM_LOG','SFC_BROOKNER_PARAM_LOG_IX2','SYS_C0073069');
--select sum(bytes)/1024/1024/1024 from user_segments where segment_name in(select index_name from user_indexes where table_name='SFC_BROOKNER_PARAM_LOG');
3、查看此表的索引高度
索引高度已经达到了最高5层,需要进行优化了。
select index_name,index_type,table_owner,table_name,compression,tablespace_name,blevel,leaf_blocks,num_rows,partitioned,visibility from user_indexes where table_owner='MESPRD' and table_name='SFC_BROOKNER_PARAM_LOG' order by num_rows;
select sum(bytes)/1024/1024/1024 from user_segments where segment_name in(select index_name from user_indexes where table_name='SFC_BROOKNER_PARAM_LOG');
4、查看索引的列
select * from user_ind_columns where table_name='SFC_BROOKNER_PARAM_LOG';
5、信息统计收集
(1)此方式在plsql developer下执行
32G内存,统计7亿行表,时间为1044.465秒
begin dbms_stats.gather_table_stats(ownname => 'MESPRD',tabname => 'SFC_BROOKNER_PARAM_LOG'); end;
(2)在sqlplus下执行
begin dbms_stats.gather_table_stats(ownname => 'MESPRD', tabname => 'SFC_BROOKNER_PARAM_LOG', estimate_percent => 15, method_opt => 'for table', cascade => false, degree => 2); end; /
6、表统计信息完成后,查看相关信息(行数,分区,块数)
select table_name,tablespace_name,num_rows,partitioned,blocks,pct_free,pct_used from user_tables where num_rows is not null order by num_rows desc;
7、表统计信息完成后,查看此表的表索引占据空间大小,以及索引高度
select index_name,index_type,table_owner,table_name,compression,tablespace_name,blevel,leaf_blocks,num_rows,partitioned,visibility from user_indexes where table_owner='MESPRD' and table_name='SFC_BROOKNER_PARAM_LOG' order by num_rows;
8、查询表数据行(7.5亿)
select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2023/05/24 16:00:46','yyyy/mm/dd hh24:mi:ss');
二、问题分析
经过上述查看,有如下问题:
1、单表数据量过大(7.5亿行,250G数据;另加索引230G),未做任何分区
2、单表索引数据量过大,且进行了多个列值的重复索引,也未作任何索引分区。
3、索引高度过高,需要做分区处理
4、数据表需要进行部分清理,并做收缩。
5、未单独创建索引表空间
三、测试流程(下述到操作只针对表SFC_BROOKNER_PARAM_LOG)
1、索引测试—删除数据测试
测试给表建立索引后,进行数据删除,和没有索引的数据删除,时间多对比;依次印证索引的必要性。
2、并行测试—删除数据测试
测试将DML并行开启后,并行删除数据是否会锁表。
3、空间测试—查看1000万数据占用空间
通过创建索引,可以快速对表进行操作,依此筛选出1000万数据,导入新的表空间,查看1000万数据占用多大空间。
进而推算7.5亿数据占用的空间,与user_segments的占用量做对比,相互印证。
4、筛选条件测试—获取要导出/导入数据的条件
因为这张表是2020年创建,到现在2023年,2020-2022年有一小部分数据需要保留,并且2023年的全年要保留。
后期会清理2023年大部分数据,保留2024年全年数据;依次类推。
所以这是测试重点,将需要保留数据的条件和开发沟通好,进行导入导出。
5、创建分区表测试—导入表的部分内容—导入/导出表测试(这是核心内容)
根据上述的筛选条件;
(1)先创建新表(分区表-根据时间做范围分区列)
(2)同时以每年时间创建一个表空间(让每年的数据根据分区定义,写入到对应表空间文件)
(3)根据筛选条件,分表导出2020,2021,2022需要保留的数据,并导入新表
(4)最后导入2023年所有数据到新分区表
6、创建分区表测试—导入表的全部数据(排除索引和统计信息)
目的是对这张表进行分区,用于下节对比全表(无分区/有索引),新全表(有分区/索引),保留内容表(有分区/有索引)的查询速度对比。
(1)先创建新表(分区表-根据时间做范围分区列)
(2)同时以每年时间创建一个表空间(让每年的数据根据分区定义,写入到对应表空间文件)
(3)导入所有表到新分区表表