目录
- 一、索引测试—删除数据测试
- 二、并行测试—删除数据测试(会锁表,不建议使用此方式清理表数据)
- 三、空间测试—查看1000万数据占用空间
- 四、筛选条件测试—获取要导出/导入数据的条件
- 五、创建分区表测试—分批次导入数据(这是核心内容)
- 六、创建分区表测试—导入表的全部数据(排除索引和统计信息)
- 七、对比全表、新分区全表/新分区保留内容表的的查询速度。
- 八、导出导入方式耗时对比(停库情况下使用,在线开并行会占用大量资源,对业务影响较大)
迁移方案7-Oracle数据迁移2—一张7.5亿行的表(没有做分区,没有优化索引)进行优化测试,并用最短停机窗口迁移到新分区表—步骤2-测试内容
一、索引测试—删除数据测试
1、先给表的时间列做索引
(1)创建索引用的表空间
create tablespace tbsp_sfc_log_index datafile '/oracle/data2/sfc_log_index_01.dbf' size 10g autoextend on next 2g uniform size 16M ;
(2)创建索引使用新的表空间
共耗时882.107秒。
create index sfc_brookner_param_log_index_time on sfc_brookner_param_log(datetime_created) tablespace tbsp_sfc_log_index;
(3)占用数据文件19G.
2、根据时间查看(使用新创建索引)
(1)根据时间查询行数:耗时36.350秒
SQL> select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2021/03/24 16:00:46','yyyy/mm/dd hh24:mi:ss') and ;
(2)查询所有数据行数量:耗时36秒钟。
SQL> select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2023/05/24 16:00:46','yyyy/mm/dd hh24:mi:ss')
3、根据时间查看(不使用新创建索引)
将索引设置为不可见,此时,正常查询,则不走此索引。
alter index sfc_brookner_param_log_index_time invisible;
(1)根据时间查询行数:耗时159秒。
select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2021/03/24 16:00:46','yyyy/mm/dd hh24:mi:ss') and ;
(2)查询所有数据行数量:耗时161秒。
select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2023/05/24 16:00:46','yyyy/mm/dd hh24:mi:ss')
4、在有时间列创建索引的情况下,删除数据测试
(1)使用logging删除1万条,需要时间8秒
delete /*+nologging*/ from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2020/04/25 3:44:30','yyyy/mm/dd hh24:mi:ss');
(2)使用logging删除10万行数据,需要时间57秒钟。
delete /*+nologging*/ from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2020/04/2 12:10:00','yyyy/mm/dd hh24:mi:ss');
(3)使用logging删除100万行数据,需要时间503.265秒钟。
delete /*+nologging*/ from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2020/04/25 01:30:00','yyyy/mm/dd hh24:mi:ss');
(4)不使用弄logging删除1万条数据,需要时间6秒
delete from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2020/04/25 6:14:40','yyyy/mm/dd hh24:mi:ss');
(5)不使用nologging删除10万条数据,需要时间55秒
delete from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2020/04/26 5:23:35','yyyy/mm/dd hh24:mi:ss');
(6)不使用nologging删除100万条数据,需要时间507秒
5、在不使用时间列创建索引的情况下,删除数据测试
将索引设置为不可见,此时,正常查询,则不走此索引。
alter index sfc_brookner_param_log_index_time invisible;
(1)删除1万条数据,耗时307秒钟。
delete from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2020/05/6 07:13:00','yyyy/mm/dd hh24:mi:ss');
(2)删除10万条数据,耗时336秒钟。
delete from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2020/05/6 05:18:00','yyyy/mm/dd hh24:mi:ss');
(3)删除100万行数据,耗时895秒钟
delete from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2020/05/16 06:27:40','yyyy/mm/dd hh24:mi:ss');
二、并行测试—删除数据测试(会锁表,不建议使用此方式清理表数据)
1、创建测试表(3000万行)
create table test222(id number,name varchar2(10),age number);
insert into test222 values(1,'LLL01',2270); insert into test222 values(1,'LLL01',2271); insert into test222 values(1,'LLL01',2272); insert into test222 values(1,'LLL01',2273); insert into test222 values(1,'LLL01',2274); insert into test222 values(1,'LLL01',2275); insert into test222 select * from test222;(执行n次,使数据达到3000万)
2、默认状态删数据
(1)删除数据(估计删除需要30分钟)
delete from test222 ;
(2)插入数据测试(可以正常插入)
insert into test222 values(1,'LLL01',2275); commit;
3、开并行删除数据
(1)开并行(对象和表都进行)
dml对象开启并行模式,如果表不开启或不用/*+parallel*+/提示,也是不用并行的。
alter session enable parallel dml; alter table test222 parallel;
(2)删除数据过程
delete from test222 ;
(3)其他session插入数据
insert into test222 values(1,'LLL01',123456);
是锁定状态:
(4)查询数据时ok的
4、结论
所以使用并行删除数据会锁表,无法在业务使用期间,不要开并行操作。
三、空间测试—查看1000万数据占用空间
1、查看当前库每月产生多少条数据
(1)查询语句(2020.01-2023.05)
select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created>=to_date('2020/01/01 00:00:00','yyyy/mm/dd hh24:mi:ss') and datetime_created<to_date('2020/05/01 00:00:00','yyyy/mm/dd hh24:mi:ss'); select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created>=to_date('2020/05/01 00:00:00','yyyy/mm/dd hh24:mi:ss') and datetime_created<to_date('2020/06/01 00:00:00','yyyy/mm/dd hh24:mi:ss'); ...... select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created>=to_date('2023/05/01 00:00:00','yyyy/mm/dd hh24:mi:ss') and datetime_created<to_date('2023/06/01 00:00:00','yyyy/mm/dd hh24:mi:ss'); select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created>=to_date('2023/06/01 00:00:00','yyyy/mm/dd hh24:mi:ss') and datetime_created<to_date('2023/07/01 00:00:00','yyyy/mm/dd hh24:mi:ss');
(2)查询语句脚本
https://download.topunix.com/Scripts/QAS/selet-sfc_brookner_param_log_2020.txt https://download.topunix.com/Scripts/QAS/selet-sfc_brookner_param_log_2021.txt https://download.topunix.com/Scripts/QAS/selet-sfc_brookner_param_log_2022.txt
(3)经查询,每月可以生成数据量为
2020.01-2020.04: 1766390 2021.05 3193536 2021.06 3621253 2021.07 18347011 2021.08 34257393 2021.09 24121489 2021.10 10965399 2021.11 31858904 2021.12 35753261 2021.01 36501246 2021.02 33229192 2021.03 35360886 2021.04 34855979 2021.05 36679160 2021.06 34444298 2021.07 12603423 2021.08 11926806 2021.09 12872676 2021.10 16627242 2021.11 13478646 2021.12 14842533 2022.01 15094229 2022.02 13597886 2022.03 15547184 2022.04 11104515 2022.05 14551325 2022.06 15277747 2022.07 15516997 2022.08 15386772 2022.09 14141314 2022.01 13775411 2022.11 13912733 2022.12 26664904 2023.01 30783895 2023.02 27632700 2023.03 31404676 2023.04 22054546 2023.05 0
2、分析1000万数据,占多大空间
(1)创建数据文件(查看1000万数据量占多大空间)。
create tablespace tbsp_sfc_log_test datafile '/oracle/data2/sfc_log_test_01.dbf' size 1g autoextend on next 500m uniform size 16M ;
(2)创建表,从原表插入1000万数据(耗时约63秒)
注:此处可以并行parallel degree(4)插入,但耗时为173秒。
create table sfc_log_test_1000w tablespace tbsp_sfc_log_test nologging as select * from SFC_BROOKNER_PARAM_LOG where datetime_created>=to_date('2021/01/01 00:00:00','yyyy/mm/dd hh24:mi:ss') and datetime_created<=to_date('2021/01/09 11:57:38','yyyy/mm/dd hh24:mi:ss') and rownum<10000001;
(3)查看数据文件,1000万数据,大约3G-3.5G
select segment_name,bytes/1024/1024/1024 from user_segments where segment_name=upper('sfc_log_test_1000w');
(4)所以总的表数量7.5亿约为:753753557*10000000*3.125=235G
和user_segements视图中统计相符。
四、筛选条件测试—获取要导出/导入数据的条件
1、筛选需求
业务需要保留2023.01之后的所有数据,以及符合列值(PARAM_POINT)的的全部数据。
2、查询条件
https://download.topunix.com/Scripts/QAS/select-sfc-log-valid-data_all.txt
3、经上述查询,需要保留的数据量大约还有1.3亿条
4、根据上述筛选条件修改,可以查看每月的历史数据数量
(1)2020.01.01-2020.12.31的数据量
筛选条件:https://download.topunix.com/Scripts/QAS/selet-sfc_brookner_param_log-2020.txt 数 据 量:8873015行
(2)2021.01.01-2021.12.31的数据量
筛选条件:https://download.topunix.com/Scripts/QAS/selet-sfc_brookner_param_log-2021.txt 数 据 量:10891323行
(3)2022.01.01-2022.12.31的数据量
筛选条件:https://download.topunix.com/Scripts/QAS/selet-sfc_brookner_param_log-2022.txt 数 据 量:4953178行
(4)2023年每月的数据量
2023.01 30783895行 2023.02 27632700行 2023.03 31404676行 2023.04 22054546行
5、结论分析
根据上述数据统计结论
(1)历史数据,我们可以根据年进行分区。
2020年数据存放于表空间:TBSP_SFCBROOKPARAMLOG_2020 —>SFC_BROOKNER_PARAM_LOG_partation_2020.dbf 2021年数据存放于表空间:TBSP_SFCBROOKPARAMLOG_2021 —>SFC_BROOKNER_PARAM_LOG_partation_2021.dbf 2022年数据存放于表空间:TBSP_SFCBROOKPARAMLOG_2022 —>SFC_BROOKNER_PARAM_LOG_partation_2022.dbf
(2)当前数据,我们也可以根据年进行分区。
2023年数据存放于表空间:TBSP_SFCBROOKPARAMLOG_2023 —>SFC_BROOKNER_PARAM_LOG_partation_2023.dbf
(3)未来数据,我们可以提前规划好分区。
2024年数据存放于表空间:TBSP_SFCBROOKPARAMLOG_2024 —>SFC_BROOKNER_PARAM_LOG_partation_2024.dbf 2025年数据存放于表空间:TBSP_SFCBROOKPARAMLOG_2024 —>SFC_BROOKNER_PARAM_LOG_partation_2025.dbf 2026年数据存放于表空间:TBSP_SFCBROOKPARAMLOG_2024 —>SFC_BROOKNER_PARAM_LOG_partation_2026.dbf 2027年数据存放于表空间:TBSP_SFCBROOKPARAMLOG_2024 —>SFC_BROOKNER_PARAM_LOG_partation_2027.dbf
五、创建分区表测试—分批次导入数据(这是核心内容)
此方式,只对SFC_BROOKNER_PARAM_LOG表操作清理,清理完成后,无法进行dbf收缩
1、先给时间列做索引
(1)创建索引用的表空间
create tablespace tbsp_sfc_log_index datafile '/oracle/oradata2/sfc_log_index_01.dbf' size 10g autoextend on next 2g uniform size 16M ;
(2)并行索引使用新的表空间-共耗时520秒(单行方式需要800秒)。
create index sfc_brookner_param_log_index_time on sfc_brookner_param_log(datetime_created) nologging parallel(degree 4) tablespace tbsp_sfc_log_index ;
(3)创建完成,关闭索引的并行模式(oltp数据库下不要使用并行模式)
alter index sfc_brookner_param_log_index_time noparallel; 或: alter index sfc_brookner_param_log_index_time parallel(degree 1);
(4)收集表的统计信息(耗费1101秒)
begin dbms_stats.gather_table_stats(ownname => 'MESPRD', tabname => 'SFC_BROOKNER_PARAM_LOG'); end;
(5)查看表行数及索引(753753557行-40秒)
select count(*) from sfc_brookner_param_log where datetime_created<=to_date('2023/05/31 00:00:00','yyyy/mm/dd hh24:mi:ss');
2、创建表空间(用于存放分区表)
(1)给所有分区创建表空间
create tablespace TBSP_SFCBROOKPARAMLOG_2020 datafile '/oracle/app/oracle/oradata/mesorcl/SFC_BROOKNER_PARAM_LOG_partation_2020.dbf' size 1G autoextend on next 500M maxsize unlimited uniform size 1M logging extent management local segment space management auto; create tablespace TBSP_SFCBROOKPARAMLOG_2021 datafile '/oracle/app/oracle/oradata/mesorcl/SFC_BROOKNER_PARAM_LOG_partation_2021.dbf' size 1G autoextend on next 500M maxsize unlimited uniform size 1M logging extent management local segment space management auto; create tablespace TBSP_SFCBROOKPARAMLOG_2022 datafile '/oracle/app/oracle/oradata/mesorcl/SFC_BROOKNER_PARAM_LOG_partation_2022.dbf' size 1G autoextend on next 500M maxsize unlimited uniform size 1M logging extent management local segment space management auto; create tablespace TBSP_SFCBROOKPARAMLOG_2023 datafile '/oracle/app/oracle/oradata/mesorcl/SFC_BROOKNER_PARAM_LOG_partation_2023_01.dbf' size 1G autoextend on next 500M maxsize unlimited uniform size 1M logging extent management local segment space management auto; alter tablespace TBSP_SFCBROOKPARAMLOG_2023 add datafile '/oracle/app/oracle/oradata/mesorcl/SFC_BROOKNER_PARAM_LOG_partation_2023_02.dbf' size 1G autoextend on next 500M maxsize unlimited uniform size 1M logging extent management local segment space management auto; create tablespace TBSP_SFCBROOKPARAMLOG_2024 datafile '/oracle/app/oracle/oradata/mesorcl/SFC_BROOKNER_PARAM_LOG_partation_2024.dbf' size 1G autoextend on next 500M maxsize unlimited uniform size 1M logging extent management local segment space management auto;
3、创建交换表
注:表结构和表SFC_BROOKNER_PARAM_LOG相同,使用分区方式。
(1)获取生产表方式
select dbms_metadata.get_ddl('TABLE','SFC_BROOKNER_PARAM_LOG','MESPRD') from dual;
(2)创建测试表,并进行范围分区
注:此处有主键,会创建一个主键索引,此索引是普通索引(全局非分区索引)。
create table sfc_brookner_param_log_range_p ( id varchar2(32) default sys_guid() not null enable, datetime_created date default sysdate not null enable, user_created varchar2(80) default 'sys' not null enable, datetime_modified date, user_modified varchar2(80), state char(1) default 'a' not null enable, enterprise_id varchar2(32) default '*' not null enable, org_id varchar2(32) not null enable, workcenter_code varchar2(80) not null enable, equipment_code varchar2(80) not null enable, param_code varchar2(80) not null enable, param_name varchar2(240) not null enable, param_point varchar2(240) not null enable, actual_value varchar2(2000), incident_desc varchar2(2000), bruckner_code varchar2(80) not null enable, is_recom char(1) default 'n' not null enable, primary key (id) using index pctfree 10 initrans 2 maxtrans 255 compute statistics storage(initial 65536 next 1048576 minextents 1 maxextents 2147483645 pctincrease 0 freelists 1 freelist groups 1 buffer_pool default flash_cache default cell_flash_cache default) tablespace mesprd_tbsp enable ) segment creation immediate pctfree 10 pctused 40 initrans 1 maxtrans 255 nocompress logging storage(initial 65536 next 1048576 minextents 1 maxextents 2147483645 pctincrease 0 freelists 1 freelist groups 1 buffer_pool default flash_cache default cell_flash_cache default) partition by range(datetime_created)( partition p_2020 values less than(to_date('2021/01/01','yyyy/mm/dd')) tablespace TBSP_SFCBROOKPARAMLOG_2020, partition p_2021 values less than(to_date('2022/01/01','yyyy/mm/dd')) tablespace TBSP_SFCBROOKPARAMLOG_2021, partition p_2022 values less than(to_date('2023/01/01','yyyy/mm/dd')) tablespace TBSP_SFCBROOKPARAMLOG_2022, partition p_2023 values less than(to_date('2024/01/01','yyyy/mm/dd')) tablespace TBSP_SFCBROOKPARAMLOG_2023, partition p_2024 values less than(to_date('2025/01/01','yyyy/mm/dd')) tablespace TBSP_SFCBROOKPARAMLOG_2024 );
4、导出数据
(1)导出要求
不导统计信息,不导索引:
(2)配置parfile参数文件
(根据服务器情况开或不开并行)
vi expdp_sfc_param_log_2020.par vi expdp_sfc_param_log_2021.par vi expdp_sfc_param_log_2022.par vi expdp_sfc_param_log_2023_part.par (注:此处导出的数据为离当前时刻比较近的时间,因为最新数据,需要停机导入,保证数据一致性)
(3)执行导出任务
expdp parfile=expdp_sfc_param_log_2020.par expdp parfile=expdp_sfc_param_log_2021.par expdp parfile=expdp_sfc_param_log_2022.par expdp parfile=expdp_sfc_param_log_2023_part.par --约1亿数据,只用4分钟完成导出,且没有开并行。
5、导入数据(未开并行)
(1)导入要求
全部导入即可。
(2)配置导入参数
vi impdp_sfc_param_log_2020.par vi impdp_sfc_param_log_2021.par vi impdp_sfc_param_log_2022.par vi impdp_sfc_param_log_2023_part.par
(2)导入数据
impdp parfile=impdp_sfc_param_log_2020.par impdp parfile=impdp_sfc_param_log_2021.par impdp parfile=impdp_sfc_param_log_2022.par impdp parfile=impdp_sfc_param_log_2023.par (导入1.1亿条数据,并行度为1,导入时间38分钟;并行度为12,导入时间?分钟)
6、停库并重启
(1)将数据库置为非归档模式
(导入数据会产生大量的redo和archivelog)
$lsnrctl stop shutdown immediate; startup mount; alter database noarchivelog; archive log list; alter databse open;
(2)导出最新数据
vi expdp_sfc_param_log_2023_end.par expdp parfile=expdp_sfc_param_log_2023_end.par
(3)导入最新数据
vi impdp_sfc_param_log_2023_end.par impdp parfile=expdp_sfc_param_log_2023_end.par
7、收集新表的统计信息
begin dbms_stats.gather_table_stats(ownname => 'MESPRD', tabname => 'SFC_BROOKNER_PARAM_LOG_RAGNE_P'); end;
8、获取当前索引的DDL
(1)查看表(SFC_BROOKNER_PARAM_LOG)有哪些索引
select * from user_indexes where table_name='SFC_BROOKNER_PARAM_LOG';
IDX_SFC_BROOKNER_PARAM_LOG SYS_C0073069 SFC_BROOKNER_PARAM_LOG_IX2
(2)获取创建索引的DDL语句
select dbms_metadata.get_ddl('INDEX','SFC_BROOKNER_PARAM_LOG_IX2','MESPRD') from dual; select dbms_metadata.get_ddl('INDEX','SYS_C0073069','MESPRD') from dual; select dbms_metadata.get_ddl('INDEX','IDX_SFC_BROOKNER_PARAM_LOG','MESPRD') from dual;
9、创建本地分区索引或全局分区索引
根据需要的列,创建分区索引。
(1)时间列-datectime_reated的索引必须要创建(本地分区索引)
create index sfc_broo_peralog_range_p_index on SFC_BROOKNER_PARAM_LOG_RANGE_p(datetime_created) local;
(2)其他组合索引(开发沟通索引重建问题,需提前沟通)
10、测试新数据(创建完了第九,十的任务,同步测试)
(1)原表删除前空间占用
(2)原表删除后空间占用
(3)查询脚本
11、原表删除,新表重命名为原表
(1)查出当前数据表在哪些数据文件中Q
select tablespace_name,file_id from dba_extents where segment_name='SFC_BROOKNER_PARAM_LOG' group by file_id,tablespace_name order by tablespace_name;
MESPRD_TBSP 2 MESPRD_TBSP 5 MESPRD_TBSP 8 MESPRD_TBSP 9 MESPRD_TBSP 10 MESPRD_TBSP 11 MESPRD_TBSP 13 MESPRD_TBSP 14 MESPRD_TBSP 15 MESPRD_TBSP 16 MESPRD_TBSP 17 MESPRD_TBSP 18 MESPRD_TBSP 19 MESPRD_TBSP 20 MESPRD_TBSP 21 MESPRD_TBSP 22 MESPRD_TBSP 23 MESPRD_TBSP 24 MESPRD_TBSP 25 MESPRD_TBSP 26 MESPRD_TBSP 27 MESPRD_TBSP 28 MESPRD_TBSP 29 MESPRD_TBSP 30 MESPRD_TBSP 31 MESPRD_TBSP 32 MESPRD_TBSP 33 MESPRD_TBSP 34 MESPRD_TBSP 35 MESPRD_TBSP 36 MESPRD_TBSP 37 MESPRD_TBSP 38 MESPRD_TBSP 39 MESPRD_TBSP 40 MESPRD_TBSP 41 MESPRD_TBSP 42 MESPRD_TBSP 43 MESPRD_TBSP 44 MESPRD_TBSP 45 MESPRD_TBSP 46 MESPRD_TBSP 47 MESPRD_TBSP 48 MESPRD_TBSP 49 MESPRD_TBSP 50 MESPRD_TBSP 51 MESPRD_TBSP 52 MESPRD_TBSP 53 MESPRD_TBSP 54 MESPRD_TBSP 55 MESPRD_TBSP 56 MESPRD_TBSP 57 MESPRD_TBSP 58 MESPRD_TBSP 59 MESPRD_TBSP 60 MESPRD_TBSP 61 MESPRD_TBSP 62 MESPRD_TBSP 63 MESPRD_TBSP 64 MESPRD_TBSP 65 MESPRD_TBSP 66
(2)查询相关索引
select * from user_indexes where table_name='SFC_BROOKNER_PARAM_LOG';
IDX_SFC_BROOKNER_PARAM_LOG SYS_C0073069 SFC_BROOKNER_PARAM_LOG_INDEX_TIME SFC_BROOKNER_PARAM_LOG_IX2
(3)删除原表及相关索引及约束等
drop table SFC_BROOKNER_PARAM_LOG cascade constraint;
(4)重命名新表名
alter table SFC_BROOKNER_PARAM_LOG_RANGE_P rename to SFC_BROOKNER_PARAM_LOG ;
12、收缩空间方案1(不适合)
(1)收缩表空间
清理上述大表后,因为水位线下降了,就可以收缩表空间了。
但是在收缩表空间文件时,出现报错:
ORA-03297: file contains used data beyond requested RESIZE value
(2)报错后,查询
Truncate table 或者 drop table 收缩数据文件,经常遇到ORA-03297: file contains used data beyond requested RESIZE value 查询dba_free_space 也有空闲空间。
经过查询MOS(Doc ID 1029252.6)得知
If you have a large extent in the middle of a datafile, and some object taking up room at the end of the datafile, you can use the query FINDEXT.SQL below to find this object. If you export this object, then drop it, you should then free up contiguous space at the end of your datafile so you will be able to resize it smaller.
Make sure you leave enough room in the datafile for importing the object back into the tablespace.
意思是说如果空闲的extent如果在文件的中间,此时无法进行resize ,必须把尾部的object drop 然后重建 再resize datafile。
(3)查看每个数据文件包含的表内容
其中一个数据文件file_id=56的,就包含了136个表,有60多个文件,每个文件中包含了各种表的信息,所以通过手动迁移表数据到其他表空间的方式不适合收缩表空间。
13、通过v$SQL获取生产库关于表SFC_BROOKNER_PARAM_LOG的信息
(1)查询关于SFC_BROOKNER_PARAM_LOG的语句
select sql_text,parse_calls,buffer_gets,disk_reads from v$sql where sql_text like '%SFC_BROOKNER_PARAM_LOG%' order by 3 desc; select sql_text,sql_id from DBA_HIST_SQLTEXT where dbms_lob.substr(sql_text,200) like '%SFC_BROOKNER_PARAM_LOG%'
(2)筛选出的语句(后期用于分析)
关于SFC_BROOKNER_PARAM_LOG的sql语句 xlsx文件:
*********************************************************************************************************
将表SFC_BROOKNER_PARAM_LOG数据全部以分区方式导入并创建分区索引,和原表对比查询速度
*********************************************************************************************************
六、创建分区表测试—导入表的全部数据(排除索引和统计信息)
1、导入大表前准备
(1)增加temp表空间(准备3个数据文件) (2)增加undo表空间(准备6个数据文件) (3)关闭归档日志模式
2、导出正式库所有数据
vi expdp_sfc_param_log_all.par expdp parfile=expdp_sfc_param_log_all.par
3、导入测试库
vi impdp_sfc_param_log_all.par impdp parfile=impdp_sfc_param_log_all.par
4、给测试库创建索引(和生产机一样)
(1)查看表(SFC_BROOKNER_PARAM_LOG)有哪些索引
select * from user_indexes where table_name='SFC_BROOKNER_PARAM_LOG';
IDX_SFC_BROOKNER_PARAM_LOG SYS_C0073069 SFC_BROOKNER_PARAM_LOG_IX2
(2)获取创建索引的DDL语句
select dbms_metadata.get_ddl('INDEX','SFC_BROOKNER_PARAM_LOG_IX2','MESPRD') from dual; select dbms_metadata.get_ddl('INDEX','SYS_C0073069','MESPRD') from dual; select dbms_metadata.get_ddl('INDEX','IDX_SFC_BROOKNER_PARAM_LOG','MESPRD') from dual;
5、根据上述索引和开发沟通进行索引重建问题
(1)时间列-datectime_reated的索引必须要创建(本地分区索引)
create index sfc_broo_peralog_range_a_index on SFC_BROOKNER_PARAM_LOG_RANGE_A(datetime_created) local;
(2)其他组合索引(开发沟通索引重建问题,需提前沟通)
七、对比全表、新分区全表/新分区保留内容表的的查询速度。
注:
SFC_BROOKNER_PARAM_LOG : 原表:数据量753753557条
SFC_BROOKNER_PARAM_LOG_RANGE_A 导入的全表:数据量753753557条
SFC_BROOKNER_PARAM_LOG_RANGE_P 导入的需要的表:136593333条
1、部分未做统计信息收集
select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2021/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --270752592条,耗时42秒,非分区表,非分区索引,做统计信息收集,执行索引快速全表扫描 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_A where datetime_created<to_date('2021/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --270752592条,耗时113秒,分区表,本地分区索引,未做统计信息收集,执行全表扫描 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_P where datetime_created<to_date('2021/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --13161727条,耗时1.244秒,本地分区索引,做统计信息收集,执行范围索引扫描
2、全部做统计信息收集—所有数据查询
select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2023/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --753753557条,耗时39秒,非分区表,非分区索引,做统计信息收集,执行索引快速全表扫描 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_A where datetime_created<to_date('2023/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --753753557条条,耗时39秒,本地分区索引,做统计信息收集,执行索引快速全表扫描 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_P where datetime_created<to_date('2023/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --136593333条,耗时4-7秒,本地分区索引,做统计信息收集,执行范围索引扫描
3、全部做统计信息收集—大于2022/05/02 12:10:00
select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created>to_date('2022/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --240324051条,耗时38秒,非分区表,非分区索引,做统计信息收集,执行索引快速全表扫描 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_A where datetime_created>to_date('2022/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --240324051条,耗时14秒,本地分区索引,做统计信息收集,执行索引快速全表扫描 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_P where datetime_created>to_date('2022/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --115485078条, 耗时3秒,本地分区索引,做统计信息收集,执行范围索引扫描
4、全部做统计信息收集—小于等于2022/05/02 12:10:00
select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created<=to_date('2022/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --513429506条,耗时42秒,非分区表,非分区索引,做统计信息收集,执行索引快速全表扫描 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_A where datetime_created<=to_date('2022/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --240324051条,耗时31秒,本地分区索引,做统计信息收集,执行索引快速全表扫描 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_P where datetime_created<=to_date('2022/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --21108255条, 耗时3秒,本地分区索引,做统计信息收集,执行范围索引扫描
5、全部做统计信息收集—大于2021/05/02 12:10:00
select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created>to_date('2021/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --448174329条,耗时39秒,非分区表,非分区索引,做统计信息收集,执行索引快速全表扫描 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_A where datetime_created>to_date('2021/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --448174329条,耗时28秒,本地分区索引,做统计信息收集,执行索引快速全表扫描 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_P where datetime_created>to_date('2021/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --121947471条, 耗时4秒,本地分区索引,做统计信息收集,执行范围索引扫描
6、全部做统计信息收集—小于等于2021/05/02 12:10:00
select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created<=to_date('2021/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --305579228条,耗时38秒,非分区表,非分区索引,做统计信息收集,执行索引快速全表扫描 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_A where datetime_created<=to_date('2021/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --305579228条,耗时23秒,本地分区索引,做统计信息收集,执行索引快速全表扫描 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_P where datetime_created<=to_date('2021/05/02 12:10:00','yyyy/mm/dd hh24:mi:ss'); --14645862条, 耗时0.7秒,本地分区索引,做统计信息收集,执行范围索引扫描
7、全部做统计信息收集—双边范围(跨年)
select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2022/05/02 12:00:00','yyyy/mm/dd hh24:mi:ss') and datetime_created>to_date('2021/05/02 12:00:00','yyyy/mm/dd hh24:mi:ss'); --207855416条,耗时46秒 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_A where datetime_created<to_date('2022/05/02 12:00:00','yyyy/mm/dd hh24:mi:ss') and datetime_created>to_date('2021/05/02 12:00:00','yyyy/mm/dd hh24:mi:ss'); --207855416条,耗时30秒,本地分区索引,做统计信息收集,执行索引快速全表扫描 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_P where datetime_created<to_date('2022/05/02 12:00:00','yyyy/mm/dd hh24:mi:ss') and datetime_created>to_date('2021/05/02 12:00:00','yyyy/mm/dd hh24:mi:ss'); --13158464,耗时0.28秒,范围索引扫描—13161727条,耗时1.244秒,本地分区索引,未做统计信息收集
8、全部做统计信息收集—双边范围(不跨年)
select count(*) from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2023/01/01 00:00:00','yyyy/mm/dd hh24:mi:ss') and datetime_created>=to_date('2022/01/01 00:00:00','yyyy/mm/dd hh24:mi:ss'); --184571017条,耗时47秒 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_A where datetime_created<to_date('2023/01/01 00:00:00','yyyy/mm/dd hh24:mi:ss') and datetime_created>=to_date('2022/01/01 00:00:00','yyyy/mm/dd hh24:mi:ss'); --184571017条,耗时7秒,本地分区索引,做统计信息收集,执行索引快速全表扫描 select count(*) from SFC_BROOKNER_PARAM_LOG_RANGE_P where datetime_created<to_date('2023/01/01 00:00:00','yyyy/mm/dd hh24:mi:ss') and datetime_created>=to_date('2022/01/01 00:00:00','yyyy/mm/dd hh24:mi:ss'); --4953178,耗时0.135秒,范围索引扫描—13161727条,耗时1.244秒,本地分区索引,未做统计信息收集
9、全部做统计信息收集—覆盖索引扫描
select count(datetime_created) from SFC_BROOKNER_PARAM_LOG where datetime_created<to_date('2021/05/02 12:00:00','yyyy/mm/dd hh24:mi:ss') and datetime_created>=to_date('2020/05/02 12:00:00','yyyy/mm/dd hh24:mi:ss'); --270733876,耗时45秒 select count(datetime_created) from SFC_BROOKNER_PARAM_LOG_RANGE_A where datetime_created<to_date('2021/05/02 12:00:00','yyyy/mm/dd hh24:mi:ss') and datetime_created>=to_date('2020/05/02 12:00:00','yyyy/mm/dd hh24:mi:ss'); --270752592条,耗时30秒,本地分区索引,做统计信息收集,执行索引快速全表扫描 select count(datetime_created) from SFC_BROOKNER_PARAM_LOG_RANGE_P where datetime_created<to_date('2021/05/02 12:00:00','yyyy/mm/dd hh24:mi:ss') and datetime_created>=to_date('2020/05/02 12:00:00','yyyy/mm/dd hh24:mi:ss'); --范围索引扫描—13161727条,耗时1.244秒,本地分区索引,未做统计信息收集
八、导出导入方式耗时对比(停库情况下使用,在线开并行会占用大量资源,对业务影响较大)
1、单通道导出全库时间:
expdp mesprd/mes800 directory=BACKUP_MES dumpfile=expdp.dmp logfile=expdp.log full=y
2、并行导出MESPRD用户数据时间:
expdp mesprd/mes800 directory=BACKUP_MES dumpfile=expdp.dmp logfile=expdp.log full=y parallel=8
3、单通道导入全库时间(过滤SFC_BROOKNER_PARAM_LOG表):02:13:17
impdp mesprd/mes800 directory=backup_mes dumpfile=expdp.dmp logfile=expdp_imp.log exclude=statistics,table:\"in \(\'SFC_BROOKNER_PARAM_LOG\'\)\" schemas=mesprd
4、并行(8路)导出MESPRD用户数据时间(过滤SFC_BROOKNER_PARAM_LOG表):01:03:14
impdp mesprd/mes800 directory=backup_mes dumpfile=expdp.dmp logfile=expdp_imp.log exclude=statistics,table:\"in \(\'SFC_BROOKNER_PARAM_LOG\'\)\" schemas=mesprd parallel=8