#隐式转换 

第一章 适用环境

  • oracle 11g+
  • linux 6.9+

第二章 Top SQL概况

下面列出我们发现的特定模块中Top SQL的相关情况:

SQL_ID

模块

SQL类型

主要问题

fnc58puaqkd1n

select

索引创建不合理,导致全索引扫描,产生了大量逻辑读

第三章 SQL优化方案

3.1 SQL_ID:fnc58puaqkd1n

3.1.1 SQL文本

SELECT MAX(TEST_ID) TEST_ID FROM TEST1 WHERE TEST_NAME = 28                                                

3.1.2 SQL执行计划

PLAN_TABLE_OUTPUT                                                                                                                                                                                       
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  fnc58puaqkd1n, child number 0                                                                                                                                                                   
-------------------------------------                                                                                                                                                                   
SELECT MAX(TEST_ID) TEST_ID FROM TEST1 WHERE TEST_NAME = 28                                                                                                                                     Plan hash value: 2527920730                                                                                                                                                                             ---------------------------------------------------------------------------------------------------                                                                                                     
| Id  | Operation             | Name                      | Rows  | Bytes | Cost (%CPU)| Time     |                                                                                                     
---------------------------------------------------------------------------------------------------                                                                                                     
|   0 | SELECT STATEMENT      |                           |       |       | 23200 (100)|          |                                                                                                     
|   1 |  SORT AGGREGATE       |                           |     1 |    13 |            |          |                                                                                                     
|*  2 |   INDEX FAST FULL SCAN| TEST1_TEST_ID_IDX         |     1 |    13 | 23200   (3)| 00:04:39 |                                                                                                     
---------------------------------------------------------------------------------------------------                                                                                                     Predicate Information (identified by operation id):                                                                                                                                                     
---------------------------------------------------                                                                                                                                                     2 - filter(TO_NUMBER("TEST_NAME")=28)     

3.1.3 SQL资源消耗

            CPU(MS)  ELA(MS)     DISK          GET        ROWS      ROWS APPLI(MS) CONCUR(MS) CLUSTER(MS) USER_IO(MS)    PLSQL     JAVA                                                                 
EXEC       PRE EXEC PRE EXEC PRE EXEC     PRE EXEC    PRE EXEC PRE FETCH  PER EXEC   PER EXEC    PER EXEC    PER EXEC PER EXEC PER EXEC SQL_PROFILE                                                     
---------- -------- -------- -------- ------------ ----------- --------- --------- ---------- ----------- ----------- -------- -------- ---------------                                                 
2887          2,116    2,146        0       89,108           1         1         0          0           0           0        0        0                                                                 

该SQL执行了2887次,每次执行的平均逻辑读为89,108,物理读为0,每次返回1条数据,耗时2.146秒,其中CPU消耗2.116秒。

四、 问题分析及优化思路

通过分析SQL文本,发现该SQL为单表扫描类型,select涉及max函数。

通过分析执行计划,SQL主要性能消耗在TEST1_TEST_ID_IDX 的全索引扫描,该索引的体积达到705MB,由于该SQL执行频率高达2887次,等待主要在CPU上,这就是该SQL执行耗时只有2秒原因。

那为什么会导致该SQL走的是快速索引全扫描,而不是索引范围扫描?观察到执行计划中有一个隐式转换,是它的原因吗?通过测试发现并不是。那问题在哪?

再看下TEST1_TEST_ID_IDX组成列的顺序是TEST_ID、TEST_NAME,而SQL的过滤条件是TEST_NAME,针对TEST_ID算MAX值,到这里问题就清楚了,索引创建的顺序有问题,前导列应该是TEST_NAME,正确的索引创建顺序应该是TEST_NAME、TEST_ID,让执行计划走MAX/MIN类型。

另外还有一个问题,该SQL存在隐式转换,观察到TEST_NAME字段类型是varchar2,而SQL传值类型是数值,如果不消除这个问题,有正确的索引仍然无法走最优的执行计划。

结合以上分析,该SQL需要消除隐式转换,再创建合适的索引即可优化。

五、 优化方案

5.1 创建组合索引

CREATE INDEX "TESTUSER"."TEST1_N1" ON "TESTUSER"."TEST1" (TEST_NAME,TEST_ID) tablespace TESTUSER_IDX  online;

5.2 查看索引效果

SQL> SELECT MAX(TEST_ID) TEST_ID FROM TESTUSER.TEST1 WHERE TEST_NAME = 28;Execution Plan
----------------------------------------------------------
Plan hash value: 3698544155------------------------------------------------------------------------------------------
| Id  | Operation             | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                  |     1 |    13 | 13251   (3)| 00:02:40 |
|   1 |  SORT AGGREGATE       |                  |     1 |    13 |            |          |
|*  2 |   INDEX FAST FULL SCAN| TEST1_N1         |  1075K|    13M| 13251   (3)| 00:02:40 |
------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - filter(TO_NUMBER("TEST_NAME")=28)

观察仍然走的TEST1_N1索引INDEX FAST FULL SCAN。有两种方案可以解决,一是创建函数索引,二是修改传参类型,这里我们选择改传参类型。

5.3 优化后的效果

SQL> SELECT MAX(TEST_ID) TEST_ID FROM TESTUSER.TEST1 WHERE TEST_NAME = '28';Execution Plan
----------------------------------------------------------
Plan hash value: 1923666499-------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                  |     1 |    13 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE              |                  |     1 |    13 |            |          |
|   2 |   FIRST ROW                  |                  |     1 |    13 |     3   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN (MIN/MAX)| TEST1_N1         |     1 |    13 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------3 - access("TEST_NAME"='28')

六、 优化效果对比

通过确认关键表数据量,制定执行计划,可以减少每次查询的逻辑读和物理读,提高SQL执行性能。

逻辑读

物理读

执行时间(s)

优化前

89,108

0

2.3

优化后

3

0

0.01


🚀 更多数据库干货,欢迎关注【安呀智数据坊】

如果你觉得这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐ 和留言 💬 交流,让我知道你还想了解哪些数据库知识!

📬 想系统学习更多数据库实战案例与技术指南?

📊 实战项目分享

📚 技术原理讲解

🧠 数据库架构思维

🛠 工具推荐与实用技巧

立即关注,持续更新中 👇

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

autoas/as 工程的RTE静态消息总线实现与端口数据交换机制详解

0. 概述 autoas/as 工程的RTE(Runtime Environment)通过自动生成C代码,将各SWC(软件组件)之间的数据通信全部静态化、结构化,实现了类似“静态消息总线”的通信模型。所有端口的数据交换都必须经过RTE接口…

【机器学习第四期(Python)】LightGBM 方法原理详解

LightGBM 概述 一、LightGBM 简介二、LightGBM 原理详解⚙️ 核心原理🧠 LightGBM 的主要特点 三、LightGBM 实现步骤(Python)🧪 可调参数推荐完整案例代码(回归任务 可视化) 参考 LightGBM 是由微软开源的…

时序数据库IoTDB监控指标采集与可视化指南

一、概述 本文以时序数据库IoTDB V1.0.1版本为例,介绍如何通过Prometheus采集Apache IoTDB的监控指标,并使用Grafana进行可视化。 二、Prometheus聚合运算符 Prometheus支持多种聚合运算符,用于在时间序列数据上进行聚合操作。以下是一些常…

React安装使用教程

一、React 简介 React 是由 Facebook 开发和维护的一个用于构建用户界面的 JavaScript 库,适用于构建复杂的单页应用(SPA)。它采用组件化、虚拟 DOM 和声明式编程等理念,已成为前端开发的主流选择。 二、React 安装方式 2.1 使用…

.NET MAUI跨平台串口通讯方案

文章目录 MAUI项目架构设计平台特定实现接口定义Windows平台实现Android平台实现 MAUI主界面实现依赖注入配置相关学习资源.NET MAUI开发移动端开发平台特定实现依赖注入与架构移动应用发布跨平台开发最佳实践性能优化测试与调试开源项目参考 MAUI项目架构设计 #mermaid-svg-OG…

BUUCTF在线评测-练习场-WebCTF习题[MRCTF2020]你传你[特殊字符]呢1-flag获取、解析

解题思路 打开靶场&#xff0c;左边是艾克&#xff0c;右边是诗人&#xff0c;下面有个文件上传按钮 结合题目&#xff0c;是一个文件上传漏洞&#xff0c;一键去世看源码可知是提交按钮&#xff0c;先上传个一句话木马.php试试 <?php eval($_POST[shell]); ?> 被过…

【容器】容器平台初探 - k8s整体架构

目录 K8s总揽 K8s主要组件 组件说明 一、Master组件 二、WokerNode组件 K8s是Kubernetes的简称&#xff0c;它是Google的开源容器集群管理系统&#xff0c;其提供应用部署、维护、扩展机制等功能&#xff0c;利用k8s能很方便地管理跨机器运行容器化的应用。 K8s总揽 K8s主…

C++--继承

文章目录 继承1. 继承的概念及定义1.1 继承的概念1.2 继承的定义1.2.1 定义格式1.2.2 继承方式和访问限定符1.2.3 继承基类成员访问方式的变化1.2.3.1 基类成员访问方式的变化规则1.2.3.2 默认继承方式 1.3 继承类模版 2. 基类和派生类的转化3. 继承中的作用域3.1 隐藏3.2 经典…

无REPOSITORY、TAG的docker悬空镜像究竟是什么?是否可删除?

有时候&#xff0c;使用docker images指令我们可以发现大量的无REPOSITORY、TAG的docker镜像&#xff0c;这些镜像究竟是什么&#xff1f; 它们没有REPOSITORY、TAG名称&#xff0c;没有办法引用&#xff0c;那么它们还有什么用&#xff1f; [rootcdh-100 data]# docker image…

创建一个基于YOLOv8+PyQt界面的驾驶员疲劳驾驶检测系统 实现对驾驶员疲劳状态的打哈欠检测,头部下垂 疲劳眼睛检测识别

如何使用Yolov8创建一个基于YOLOv8的驾驶员疲劳驾驶检测系统 文章目录 1. 数据集准备2. 安装依赖3. 创建PyQt界面4. 模型训练1. 数据集准备2. 模型训练数据集配置文件 (data.yaml)训练脚本 (train.py) 3. PyQt界面开发主程序 (MainProgram.py) 4. 运行项目5. 关键代码解释数据集…

使用FFmpeg将YUV编码为H.264并封装为MP4,通过api接口实现

YUV数据来源 摄像头直接采集的原始视频流通常为YUV格式&#xff08;如YUV420&#xff09;&#xff0c;尤其是安防摄像头和网络摄像头智能手机、平板电脑的摄像头通过硬件接口视频会议软件&#xff08;如Zoom、腾讯会议&#xff09;从摄像头捕获YUV帧&#xff0c;进行预处理&am…

tcpdump工具交叉编译

本文默认系统已经安装了交叉工具链环境。 下载相关版本源码 涉及tcpdump源码&#xff0c;以及tcpdump编译过程依赖的pcap库源码。 网站&#xff1a;http://www.tcpdump.org/release wget http://www.tcpdump.org/release/libpcap-1.8.1.tar.gz wget http://www.tcpdump.org/r…

神经网络中torch.nn的使用

卷积层 通过卷积核&#xff08;滤波器&#xff09;在输入数据上滑动&#xff0c;卷积层能够自动检测和提取局部特征&#xff0c;如边缘、纹理、颜色等。不同的卷积核可以捕捉不同类型的特征。 nn.conv2d() in_channels:输入的通道数&#xff0c;彩色图片一般为3通道 out_c…

在MATLAB中使用GPU加速计算及多GPU配置

文章目录 在MATLAB中使用GPU加速计算及多GPU配置一、基本GPU加速使用1. 检查GPU可用性2. 将数据传输到GPU3. 执行GPU计算 二、多GPU配置与使用1. 选择特定GPU设备2. 并行计算工具箱中的多GPU支持3. 数据并行处理&#xff08;适用于深度学习&#xff09; 三、高级技巧1. 异步计算…

【unitrix】 4.12 通用2D仿射变换矩阵(matrix/types.rs)

一、源码 这段代码定义了一个通用的2D仿射变换矩阵结构&#xff0c;可用于表示二维空间中的各种线性变换。 /// 通用2D仿射变换矩阵&#xff08;元素仅需实现Copy trait&#xff09; /// /// 该矩阵可用于表示二维空间中的任意仿射变换&#xff0c;支持以下应用场景&#xff…

android RecyclerView隐藏整个Item后,该Item还占位留白问题

前言 android RecyclerView隐藏整个Item后,该Item还占位留白问题 思考了利用隐藏和现实来控制item 结果实现不了方案 解决方案 要依据 model 的第三个参数&#xff08;布尔值&#xff09;决定是否保留数据&#xff0c;可以通过 ​filter 高阶函数结合 ​空安全操作符​ 实…

地图瓦片介绍与地图瓦片编程下载

前沿 地图瓦片指将一定范围内的地图按照一定的尺寸和格式&#xff0c;按缩放级别或者比例尺&#xff0c;切成若干行和列的正方形栅格图片&#xff0c;对切片后的正方形栅格图片被形象的称为瓦片[。瓦片通常应用于B/S软件架构下&#xff0c;浏览器从服务器获取地图数据&#xf…

手机屏亮点缺陷修复及相关液晶线路激光修复原理

摘要 手机屏亮点缺陷严重影响显示品质&#xff0c;液晶线路短路、电压异常是导致亮点的关键因素。激光修复技术凭借高能量密度与精准操控性&#xff0c;可有效修复液晶线路故障&#xff0c;消除亮点缺陷。本文分析亮点缺陷成因&#xff0c;深入探究液晶线路激光修复原理、工艺…

MySQL数据一键同步至ClickHouse数据库

随着数据量的爆炸式增长和业务场景的多样化&#xff0c;传统数据库系统如MySQL虽然稳定可靠&#xff0c;但在海量数据分析场景下逐渐显露出性能瓶颈。这时&#xff0c;ClickHouse凭借其列式存储架构和卓越的OLAP&#xff08;在线分析处理&#xff09;能力脱颖而出&#xff0c;成…

Android中Compose常用组件以及布局使用方法

一、基础控件详解 1. Text - 文本控件 Text(text "Hello Compose", // 必填&#xff0c;显示文本color Color.Blue, // 文字颜色fontSize 24.sp, // 字体大小&#xff08;注意使用.sp单位&#xff09;fontStyle FontStyle.Italic, // 字体样式&…