拓扑园

  • O&M
    • Universal部署
    • PHP+VUE+Laravel相关
  • Oracle性能优化
  • Oracle项目案例
    • Oracle近期项目案例(目录)
    • Oracle实战问题解析(目录)
    • Oracle数据库名变更流程(2种方式)
    • Oracle数据库目录更换流程(使用Oracle的clone工具)
    • Oracle数据库迁移方案(目录)
    • 标准化文档系列
  • Oracle基础知识
    • LLL的Oracle培训(分类)
    • LLL的docker培训(分类)
    • 标准化文档系列--(分类)
    • Oracle核心经典分析(分类)
    • 图灵小队----(分类并包含以下文章)
    • --MySQL8.0/Oracle/Memcached/Redis等安装配置于RHEL/OL6/7/8.X系列-运行环境最优配置
    • --PG安装配置于RHEL/9X系列-运行环境最优配置
    • --自动维护任务详解-开启、关闭信息统计收集(统计信息)
    • --图灵小队—Oracle/PostgreSQL下创建一个用户测试表(自行定义数据行)
    • --图灵小队-Oracle存储过程导出表的明细_UTL_FILE(文章)
    • --图灵小队-Oracle数据库删除/卸载操作指南(文章)
    • --图灵小队-Oracle常用性能查询SQL语句(文章)
    • --图灵小队-Oracle数据库上线前检查(文章)
    • --图灵小队-Oracle常用SQL语句(文章)
    • --图灵小队—Linux/Oracle脚本/MySQL合集(持续更新)
    • --图灵小队-Oracle技巧记录(文章)
    • ADG
    • RAC
    • ASM
    • OGG
    • RMAN
    • EXPDP/IMPDP
    • 工厂数据导入导出系列
  • MySQL
    • MySQL数据库规范
    • MySQL项目案例
    • MySQL安装配置
    • MYSQL集群项目
    • MySQL常见处理
    • MySQL-Sysbench专题
    • MySQL-Percona Toolkit专题
  • Linux
    • Shell编程
    • kubernetes
    • docker
    • Linux
    • PHP
    • Nginx
    • haproxy
    • mail
    • 网站
    • 域名
    • 网址收藏
  • 数据中心
    • 新框架系统集合
    • 工作文档
    • EBS数据文件扩容
    • VMware虚拟化
    • EBS系列
    • 大数据
    • SVN
    • zabbix
    • SAP
    • 备份相关
    • FC交换机
    • SVN
  • K-Studing
    • D8-Python学习
    • Oracle/MySQl等面试题
    • LG-MySQL
    • LG-Docker/K8S
    • LG-PostgreSQL
    • LG-ORACLE_BBED
    • LG-ORACLE
    • LG-Elasticsearch(ES)+ELK
    • Oracle-19C-OCP
    • WERN_ORACLE培训
    • redis数据库
    • Nginx培训学习系列
  • 其他
    • 外研英语4年级下册-听力
    • 影视系列
    • 如何使用iTunes软件通过抓包下载旧版本的ios的app
天高任鸟飞
Oracle/MySQL数据库恢复/数据迁移/生产规范报告技术交流:TEL:18562510581(微信同号);加微信入群
  1. 首页
  2. Oracle项目案例
  3. Oracle数据库迁移方案
  4. 正文

迁移方案7-Oracle数据迁移2—一张7.5亿行的表(没有做分区,没有优化索引)进行优化测试,并用最短停机窗口迁移到新分区表—步骤2-测试内容

2023年5月25日 1086点热度 0人点赞 0条评论

目录

  • 一、索引测试—删除数据测试
    • 1、先给表的时间列做索引
      • (1)创建索引用的表空间
      • (2)创建索引使用新的表空间
      • (3)占用数据文件19G.
    • 2、根据时间查看(使用新创建索引)
      • (1)根据时间查询行数:耗时36.350秒
      • (2)查询所有数据行数量:耗时36秒钟。
    • 3、根据时间查看(不使用新创建索引)
      • (1)根据时间查询行数:耗时159秒。
      • (2)查询所有数据行数量:耗时161秒。
    • 4、在有时间列创建索引的情况下,删除数据测试
      • (1)使用logging删除1万条,需要时间8秒
      • (2)使用logging删除10万行数据,需要时间57秒钟。
      • (3)使用logging删除100万行数据,需要时间503.265秒钟。
      • (4)不使用弄logging删除1万条数据,需要时间6秒
      • (5)不使用nologging删除10万条数据,需要时间55秒
      • (6)不使用nologging删除100万条数据,需要时间507秒
    • 5、在不使用时间列创建索引的情况下,删除数据测试
      • (1)删除1万条数据,耗时307秒钟。
      • (2)删除10万条数据,耗时336秒钟。
      • (3)删除100万行数据,耗时895秒钟
  • 二、并行测试—删除数据测试(会锁表,不建议使用此方式清理表数据)
    • 1、创建测试表(3000万行)
    • 2、默认状态删数据
      • (1)删除数据(估计删除需要30分钟)
      • (2)插入数据测试(可以正常插入)
    • 3、开并行删除数据
      • (1)开并行(对象和表都进行)
      • (2)删除数据过程
      • (3)其他session插入数据
      • (4)查询数据时ok的
    • 4、结论
  • 三、空间测试—查看1000万数据占用空间
    • 1、查看当前库每月产生多少条数据
      • (1)查询语句(2020.01-2023.05)
      • (2)查询语句脚本
      • (3)经查询,每月可以生成数据量为
    • 2、分析1000万数据,占多大空间
      • (1)创建数据文件(查看1000万数据量占多大空间)。
      • (2)创建表,从原表插入1000万数据(耗时约63秒)
      • (3)查看数据文件,1000万数据,大约3G-3.5G
      • (4)所以总的表数量7.5亿约为:753753557*10000000*3.125=235G
  • 四、筛选条件测试—获取要导出/导入数据的条件
    • 1、筛选需求
    • 2、查询条件
    • 3、经上述查询,需要保留的数据量大约还有1.3亿条
    • 4、根据上述筛选条件修改,可以查看每月的历史数据数量
      • (1)2020.01.01-2020.12.31的数据量
      • (2)2021.01.01-2021.12.31的数据量
      • (3)2022.01.01-2022.12.31的数据量
      • (4)2023年每月的数据量
    • 5、结论分析
      • (1)历史数据,我们可以根据年进行分区。
      • (2)当前数据,我们也可以根据年进行分区。
      • (3)未来数据,我们可以提前规划好分区。
  • 五、创建分区表测试—分批次导入数据(这是核心内容)
    • 1、先给时间列做索引
      • (1)创建索引用的表空间
      • (2)并行索引使用新的表空间-共耗时520秒(单行方式需要800秒)。
      • (3)创建完成,关闭索引的并行模式(oltp数据库下不要使用并行模式)
      • (4)收集表的统计信息(耗费1101秒) 
      • (5)查看表行数及索引(753753557行-40秒)
    • 2、创建表空间(用于存放分区表)
      • (1)给所有分区创建表空间
    • 3、创建交换表
      • (1)获取生产表方式
      • (2)创建测试表,并进行范围分区
    • 4、导出数据
      • (1)导出要求
      • (2)配置parfile参数文件
      • (3)执行导出任务
    • 5、导入数据(未开并行)
      • (1)导入要求
      • (2)配置导入参数
      • (2)导入数据
    • 6、停库并重启
      • (1)将数据库置为非归档模式
      • (2)导出最新数据
      • (3)导入最新数据
    • 7、收集新表的统计信息
    • 8、获取当前索引的DDL
      • (1)查看表(SFC_BROOKNER_PARAM_LOG)有哪些索引
      • (2)获取创建索引的DDL语句
    • 9、创建本地分区索引或全局分区索引
      • (1)时间列-datectime_reated的索引必须要创建(本地分区索引)
      • (2)其他组合索引(开发沟通索引重建问题,需提前沟通)
    • 10、测试新数据(创建完了第九,十的任务,同步测试)
      • (1)原表删除前空间占用
      • (2)原表删除后空间占用
      • (3)查询脚本
    • 11、原表删除,新表重命名为原表
      • (1)查出当前数据表在哪些数据文件中Q
      • (2)查询相关索引
      • (3)删除原表及相关索引及约束等
      • (4)重命名新表名
    • 12、收缩空间方案1(不适合)
      • (1)收缩表空间
      • (2)报错后,查询
      • (3)查看每个数据文件包含的表内容
    • 13、通过v$SQL获取生产库关于表SFC_BROOKNER_PARAM_LOG的信息
      • (1)查询关于SFC_BROOKNER_PARAM_LOG的语句
      • (2)筛选出的语句(后期用于分析)
  • 六、创建分区表测试—导入表的全部数据(排除索引和统计信息)
    • 1、导入大表前准备
    • 2、导出正式库所有数据
    • 3、导入测试库
    • 4、给测试库创建索引(和生产机一样)
      • (1)查看表(SFC_BROOKNER_PARAM_LOG)有哪些索引
      • (2)获取创建索引的DDL语句
    • 5、根据上述索引和开发沟通进行索引重建问题
      • (1)时间列-datectime_reated的索引必须要创建(本地分区索引)
      • (2)其他组合索引(开发沟通索引重建问题,需提前沟通)
  • 七、对比全表、新分区全表/新分区保留内容表的的查询速度。
    • 1、部分未做统计信息收集
    • 2、全部做统计信息收集—所有数据查询
    • 3、全部做统计信息收集—大于2022/05/02 12:10:00
    • 4、全部做统计信息收集—小于等于2022/05/02 12:10:00
    • 5、全部做统计信息收集—大于2021/05/02 12:10:00
    • 6、全部做统计信息收集—小于等于2021/05/02 12:10:00
    • 7、全部做统计信息收集—双边范围(跨年)
    • 8、全部做统计信息收集—双边范围(不跨年)
    • 9、全部做统计信息收集—覆盖索引扫描
  • 八、导出导入方式耗时对比(停库情况下使用,在线开并行会占用大量资源,对业务影响较大)
    • 1、单通道导出全库时间:
    • 2、并行导出MESPRD用户数据时间:
    • 3、单通道导入全库时间(过滤SFC_BROOKNER_PARAM_LOG表):02:13:17
    • 4、并行(8路)导出MESPRD用户数据时间(过滤SFC_BROOKNER_PARAM_LOG表):01:03:14

迁移方案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

 

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2024年4月12日

admin

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

COPYRIGHT © 2022 拓扑园. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

鲁ICP备2021020523号

鲁ICP备2021020523号