[2023-09-13]使用EXPDP/IMPDP迁移数据库后统计信息引起的性能问题

news2024/11/25 20:45:09

问题描述:

        客户在使用expdp/impdp迁移数据库完成后,在新环境收集统计信息,但是在迁移完成的当天中午,好多SQL语句执行变慢,执行计划发生了改变,下面通过案例来说明。

1、准备数据

scott用户下创建test表,插入9999行数据,并且把id>2的全部更新成99,这样id列数据就会出现严重倾斜。


conn scott/tiger
drop table test purge;
create table test (id int, name varchar2(20));
insert into test select level lv, dbms_random.string('l',20) from dual connect by level < 10000;
update test set id = 99 where id > 2;
commit;

2、 根据ID列查询TEST表(这样ID列会记录在col_usage$视图里面)


SQL> select * from test where id = 1;

        ID NAME
---------- ------------------------------------------------------------
         1 whkefbijsvipefdgnoez

SQL> 

#####根据test表对应的object_id查询col_usage$视图
SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;

PL/SQL procedure successfully completed.

SQL> select * from col_usage$ where obj# = (select object_id from dba_objects where object_name = 'TEST' and owner='SCOTT');

      OBJ#    INTCOL# EQUALITY_PREDS EQUIJOIN_PREDS NONEQUIJOIN_PREDS
---------- ---------- -------------- -------------- -----------------
RANGE_PREDS LIKE_PREDS NULL_PREDS TIMESTAMP
----------- ---------- ---------- ---------------
     97981          1              1              0                 0
          1          0          0 13-SEP-23

3、对TEST表收集统计信息,统计信息参数都不用写,用默认值



SQL> exec DBMS_STATS.GATHER_TABLE_STATS(ownname=>'SCOTT',tabname=>'TEST');

PL/SQL procedure successfully completed.

SQL> 

4、查看TEST表列的统计信息


可以看到ID列上面有直方图信息

SQL> set lin 200
SQL> col COLUMN_NAME for a30
SQL> select a.column_name,
  2  b.num_rows,
  3  a.num_distinct distinct_num,
  4  round(a.num_distinct / b.num_rows * 100, 2) selectivity,
  5  a.histogram,
  6  a.num_buckets
  7  from dba_tab_col_statistics a, dba_tables b
  8  where a.owner = b.owner
  9  and a.table_name = b.table_name
 10  and a.owner = 'SCOTT'
 11  and a.table_name = 'TEST';

COLUMN_NAME                      NUM_ROWS DISTINCT_NUM SELECTIVITY HISTOGRAM                                     NUM_BUCKETS
------------------------------ ---------- ------------ ----------- --------------------------------------------- -----------
NAME                                 9999         9999         100 NONE                                                    1
ID                                   9999            3         .03 FREQUENCY                                               3

SQL> 

5、导出TEST


统计信息也一起导出

[oracle@11g ~]$ cat expdp_full_data.par 
userid="/ as sysdba"
directory=MY_DIR
dumpfile=expdp_full_data_%U.dmp
logfile=expdp_full_data.log
PARALLEL=16
CLUSTER=N
tables=scott.test
compression=all
[oracle@11g ~]$ expdp parfile=expdp_full_data.par

Export: Release 11.2.0.4.0 - Production on Wed Sep 13 14:57:55 2023

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
FLASHBACK automatically enabled to preserve database integrity.
Starting "SYS"."SYS_EXPORT_TABLE_01":  /******** AS SYSDBA parfile=expdp_full_data.par 
Estimate in progress using BLOCKS method...
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 384 KB
. . exported "SCOTT"."TEST"                              129.0 KB    9999 rows
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Master table "SYS"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYS.SYS_EXPORT_TABLE_01 is:
  /home/oracle/dir/expdp_full_data_01.dmp
  /home/oracle/dir/expdp_full_data_02.dmp
Job "SYS"."SYS_EXPORT_TABLE_01" successfully completed at Wed Sep 13 14:58:03 2023 elapsed 0 00:00:06

[oracle@11g ~]$ 

6、DROP TEST表


SQL> drop table test purge;

Table dropped.

SQL> 

7、重新导入TEST表


[oracle@11g ~]$ cat impdp_full_data.par 
userid="/ as sysdba"
directory=MY_DIR
dumpfile=expdp_full_data_%U.dmp
logfile=impdp_full_data.log
PARALLEL=16
CLUSTER=N
full=y
[oracle@11g ~]$ impdp parfile=impdp_full_data.par

Import: Release 11.2.0.4.0 - Production on Wed Sep 13 15:00:23 2023

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Master table "SYS"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "SYS"."SYS_IMPORT_FULL_01":  /******** AS SYSDBA parfile=impdp_full_data.par 
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "SCOTT"."TEST"                              129.0 KB    9999 rows
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Job "SYS"."SYS_IMPORT_FULL_01" successfully completed at Wed Sep 13 15:00:27 2023 elapsed 0 00:00:03

[oracle@11g ~]$ 

8、查看TEST表统计信息


上面还有直方图信息

SQL> set lin 200
SQL> col COLUMN_NAME for a30
SQL> select a.column_name,
  2  b.num_rows,
  3  a.num_distinct distinct_num,
  4  round(a.num_distinct / b.num_rows * 100, 2) selectivity,
  5  a.histogram,
  6  a.num_buckets
  7  from dba_tab_col_statistics a, dba_tables b
  8  where a.owner = b.owner
  9  and a.table_name = b.table_name
 10  and a.owner = 'SCOTT'
 11  and a.table_name = 'TEST';

COLUMN_NAME                      NUM_ROWS DISTINCT_NUM SELECTIVITY HISTOGRAM                                     NUM_BUCKETS
------------------------------ ---------- ------------ ----------- --------------------------------------------- -----------
NAME                                 9999         9999         100 NONE                                                    1
ID                                   9999            3         .03 FREQUENCY                                               3

9、重新收集统计信息


SQL> select * from col_usage$ where obj# = (select object_id from dba_objects where object_name = 'TEST' and owner='SCOTT');


no rows selected

SQL> SQL> exec DBMS_STATS.GATHER_TABLE_STATS(ownname=>'SCOTT',tabname=>'TEST');

PL/SQL procedure successfully completed.

SQL> 

9、再次确认TEST表的统计信息


发现ID的直方图信息没有了,数据倾斜没有直方图信息,可能导致执行计划不准确。

SQL> set lin 200
SQL> col COLUMN_NAME for a30
SQL> select a.column_name,
  2  b.num_rows,
  3  a.num_distinct distinct_num,
  4  round(a.num_distinct / b.num_rows * 100, 2) selectivity,
  5  a.histogram,
  6  a.num_buckets
  7  from dba_tab_col_statistics a, dba_tables b
  8  where a.owner = b.owner
  9  and a.table_name = b.table_name
 10  and a.owner = 'SCOTT'
 11  and a.table_name = 'TEST';

COLUMN_NAME                      NUM_ROWS DISTINCT_NUM SELECTIVITY HISTOGRAM                                     NUM_BUCKETS
------------------------------ ---------- ------------ ----------- --------------------------------------------- -----------
NAME                                 9999         9999         100 NONE                                                    1
ID                                   9999            3         .03 NONE                                                    1

SQL> 

##########

前面步骤都一样,但是如果导入数据之后,使用repeat的方式收集,直方图信息还在


SQL> set wrap off
SQL> set lin 200
SQL> set lin 200
SQL> col COLUMN_NAME for a30
SQL> select a.column_name,
  2  b.num_rows,
  3  a.num_distinct distinct_num,
  4  round(a.num_distinct / b.num_rows * 100, 2) selectivity,
  5  a.histogram,
  6  a.num_buckets
  7  from dba_tab_col_statistics a, dba_tables b
  8  where a.owner = b.owner
  9  and a.table_name = b.table_name
 10  and a.owner = 'SCOTT'
 11  and a.table_name = 'TEST';

COLUMN_NAME                      NUM_ROWS DISTINCT_NUM SELECTIVITY HISTOGRAM                                     NUM_BUCKETS
------------------------------ ---------- ------------ ----------- --------------------------------------------- -----------
NAME                                 9999         9999         100 NONE                                                    1
ID                                   9999            3         .03 FREQUENCY                                               3

SQL> exec DBMS_STATS.GATHER_TABLE_STATS(ownname=>'SCOTT',tabname=>'TEST',ESTIMATE_PERCENT=>10,method_opt=>'for all columns size repeat',cascade=>true,force=>true,degree=>8);

PL/SQL procedure successfully completed.

SQL> set lin 200
SQL> col COLUMN_NAME for a30
SQL> select a.column_name,
  2  b.num_rows,
  3  a.num_distinct distinct_num,
  4  round(a.num_distinct / b.num_rows * 100, 2) selectivity,
  5  a.histogram,
  6  a.num_buckets
  7  from dba_tab_col_statistics a, dba_tables b
  8  where a.owner = b.owner
  9  and a.table_name = b.table_name
 10  and a.owner = 'SCOTT'
 11  and a.table_name = 'TEST';

COLUMN_NAME                      NUM_ROWS DISTINCT_NUM SELECTIVITY HISTOGRAM                                     NUM_BUCKETS
------------------------------ ---------- ------------ ----------- --------------------------------------------- -----------
NAME                                10009        10009         100 NONE                                                    1
ID                                  10009            3         .03 FREQUENCY                                               3

SQL> 

所以,使用expdp/impdp迁移数据库后,如果使用默认的方式收集统计信息,会导致列上面的直方图信息丢失,造成SQL执行计划和原库存在差异,SQL执行效率变低,随着数据库运行一段时间后, col_usage$表中记录的列越来越多,使用默认的方式(for all columns size auto)的方式也会逐渐把列的直方图收集。如果生产中SQL遇到了问题,需要手动收集统计信息(因为SQL已经运行过,where条件中用到的列已经记录到col_usage$中,所以auto的方式也会把where中的列收集直方图)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1014984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进程控制再学习

0.“开两个终端窗口” 因为学校用的虚拟机&#xff0c;得用终端登录&#xff0c;不能像shell一样直接复制窗口。 我们只需要登录两次就可以了&#xff08;方便监视&#xff09; 1.ps 1.循环ps while :;do ps -f;ps -ef|grep zombie;done 每秒打印一次&#xff1a; while :…

基于SSM+Vue的校园教务系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

报修工单系统如何提升维修维保工作效率?

在日常的报修维修工作中&#xff0c;我们经常会遇到一些挑战。其中数据分析是一项艰巨的任务&#xff0c;因为我们需要处理大量的数据并从中提取有价值的信息。维修工单的统计也是一个复杂的过程&#xff0c;需要对工单进行分类和整理&#xff0c;以便更好地了解工作的进度和效…

sudo+vim+g++/gcc+makefile+进度条

目录 一、信任表中加入指定的普通用户&#xff08;使其能使用sudo&#xff09; 二、vim的使用 &#xff08;一&#xff09;基本概念 1. 正常/普通/命令模式(Normal mode) 2. 插入模式(Insert mode) 3. 末行模式(last line mode) &#xff08;二&#xff09;vim正常模式…

国庆中秋特辑(一)浪漫祝福方式 用循环神经网络(RNN)或长短时记忆网络(LSTM)生成祝福诗词

目录 一、使用深度学习中的循环神经网络&#xff08;RNN&#xff09;或长短时记忆网络&#xff08;LSTM&#xff09;生成诗词二、优化&#xff1a;使用双向 LSTM 或 GRU 单元来更好地捕捉上下文信息三、优化&#xff1a;使用生成对抗网络&#xff08;GAN&#xff09;或其他技术…

根据keypoint生成heatmap

这里keypoint是有类别的&#xff0c;生成的heatmap是每个通道对应每个类别的heatmap 第一种会比较慢&#xff0c;第二种会比较快 第一种 def generate_heatmap(heatmap_size, sigma, class_num, keypoints, normalization): """generate gaussian heatmap:…

0.96寸OLED屏显示测试和代码详细分析SPI通信

第一次尝试点亮 程序代码地址,密码&#xff1a;1234。 买了一个两色的oled&#xff0c;然后下载了资料&#xff0c;手里有一个8266的arduino&#xff0c;所以为了方便就直接用了。使用arduino主要原因&#xff0c;单片机keil太大&#xff0c;来回找文件修改引脚比较麻烦。实际…

在ubuntu20下使用花生壳映射vscode SSH

1、在ubuntu20下安装花生壳 下载花生壳&#xff1a;花生壳客户端官方下载 - 贝锐花生壳官网 选择ubuntu 或者 wget "https://dl.oray.com/hsk/linux/phddns_5.2.0_amd64.deb" -O phddns_5.2.0_amd64.deb 安装 :sudo dpkg -i phddns_5.2.0_amd64.deb" -O phddns…

【sgGoogleTranslate】自定义组件:基于Vue.js用谷歌Google Translate翻译插件实现网站多国语言开发

sgGoogleTranslate源码 <template><div :id"$options.name"> </div> </template> <script> export default {name: "sgGoogleTranslate",props: ["languages", "currentLanguage"],data() {return {//…

图解曲线积分的对称性

1.图解曲线积分的对称性 1.1 第一类曲线积分的一般对称性 二重积分、三重积分、第一类曲线积分、第一类曲面积分的一般对称性其原理都类似 平面曲线和空间曲线的原理一样&#xff0c;以下内容以空间曲线为例 图中所示为积分区域 Γ \Gamma Γ&#xff0c;函数 f ( x , y , z…

利用 Python PyPDF2库轻松提取PDF文本(及其他高级操作)

当需要从PDF文件中提取文本时&#xff0c;Python中的PyPDF2库是一个非常有用的工具。无论您是需要分析PDF文档中的内容还是需要在文档中搜索特定的信息&#xff0c;PyPDF2都可以帮助您轻松实现这些任务。 在本文中&#xff0c;我们将探讨如何使用PyPDF2库提取PDF文件中的文本&…

vue学习之vue cli创建项目

安装 node.js https://nodejs.org/en 安装 vue cli npm install -g @vue/cli --registry=https://registry.npm.taobao.org创建项目 执行创建命令,回车vue create vue-cli-learning选择 “Manually select features”,回车 “空格” 关闭 Linter / Formatter 选项,回车

开源库源码分析:OkHttp源码分析(二)

开源库源码分析&#xff1a;OkHttp源码分析&#xff08;二&#xff09; 导言 上一篇文章中我们已经分析到了OkHttp对于网络请求采取了责任链模式&#xff0c;所谓责任链模式就是有多个对象都有机会处理请求&#xff0c;从而避免请求发送者和接收者之间的紧密耦合关系。这篇文章…

【数据结构】链表面试题

203.移除链表元素 206.反转链表 876.链表的中间结点 牛客.链表中倒数第k个结点 21.合并两个有序链表 牛客.链表分隔 牛客.链表的回文结构 160.相交链表 141.环形链表 142.环形链表2 1. 移除链表元素 题目描述 思路&#xff1a; 定义一个指针cur遍历整个链表&#xff0c;一个ta…

阿里云 linux 的nginx 配置uni-app的H5前端项目vue,后端接口阿里云。

背景 vue项目调用接口是阿里云的&#xff0c;H5网站也要部署到阿里云&#xff0c;2个不同的服务器&#xff0c;需要做nginx部署与api代理。 端口配置 首先当然是买个阿里云服务器&#xff0c;这里是配置是linux系统&#xff0c;配置访问的域名 &#xff0c;再接着&#xff1…

【李沐深度学习笔记】数据操作

本课观看地址 数据操作p1 N维数组样例 N维数组是机器学习和神经网络的主要数据结构 1-d向量就是样本的各特征抽象成一个向量&#xff1b;2-d矩阵的每一行是一个样本&#xff0c;每一行都是一个样本的特征向量 3-d可以表示RGB图片&#xff0c;RGB图像是一个三维数组&#xff…

MarkText如何实现图床-解决md上传到csdn图片不显示的问题

安装picgo-core-这样做无法自动上传截图 npm install picgo -g配置-此处以github为例 picgo set uploader github生成token settings>Developer settings>Personal access tokens>Token(classic) 配置MarkText 点击左下角的设置在弹出的窗口后选择左边的Image在右…

学习Bootstrap 5的第十三天

目录 提示框 如何创建提示框 实例 指定提示框的位置 实例 弹出框 如何创建弹出框 实例 指定弹出框的位置 实例 关闭弹出框 实例 提示框 提示框是一个小小的弹窗&#xff0c;在鼠标移动到元素上显示&#xff0c;鼠标移到元素外就消失。 如何创建提示框 Bootstrap…

VIRTIO-SCSI代码分析(2)VIRTIO 驱动分析

QEMU模拟出VIRTIO SCSI设备后&#xff0c;在虚拟机中呈现SCSI设备和PCIE设备。而在虚拟机中&#xff0c;PCIE设备与VIRTIO PCI驱动匹配触发virtio_pci_probe()注册生成virtio设备&#xff0c;而virtio设备与虚拟机中的virtio驱动匹配触发对应probe函数最终注册对应的驱动。 这里…

T5 和 mT5

T5Architecture&#xff1a;The Best One1. Main Body2. Embedding3. Pertrain and Finetune4. Multi-Task Pertrain and Finetune5. T5总结 mT5 T5&#xff1a;https://arxiv.org/pdf/1910.10683.pdf T5 blog: https://ai.googleblog.com/2020/02/exploring-transfer-learning…