阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

改写函数提高SQL效率的研究

269次阅读
没有评论

共计 1856 个字符,预计需要花费 5 分钟才能阅读完成。

这是 2016 年 8 月份上海 MOORACLE 大会上陈宏义老师 (老 K) 分享的一个案例,将一个 merge SQL,通过改写成 plsql 的方式,大大提高了执行效率。老虎刘在看到这个案例的时候,开始没有注意到执行计划里面显示的各表实际记录数,不认为 plsql 的改写方式比分析函数的写法更高效,还与陈老师有过几次邮件讨论,直到后来仔细查看了执行计划。

原 SQL 如下:

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

这个 SQL 是将用户交易明细表(t_trade)的最近的一笔消费额,更新到用户信息表(t_customer)的消费额字段,使用的是 merge 操作。

执行计划:

改写函数提高 SQL 效率的研究

老虎刘注:

在没有掌握分析函数的写法前,SQL 的红色部分是 group by 后取其他字段信息的一个较为常见的写法,也是这个 SQL 执行效率差的根本原因。

原 SQL 还有一个隐患,就是如果 t_trade 的某个 cstno 对应的最大 trade_date 有重复,那么这个 SQL 会报 ORA-30926 错误无法执行。

如果不仔细看执行计划(两表的真实数据量信息),这种 SQL 的惯用优化方法是使用分析函数改写:

改写方法 1:

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

这种改写方法会比原 SQL 效率提高很多,而且不存在某个 cstno 对应的 max trade_date 重复时报错的问题。

但是陈老师没有使用分析函数的改写方法,而是根据两表数据量相差较大的特点,将 SQL 改写成一段更为高效的 plsql:

改写方法 2:

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

根据原 SQL 的执行计划我们知道,t_customer 表的记录数比较少,只有 1000 多条,而 t_trade 表有 1000 万条,比例为 1:10000(不知道这是真实数据还是测试数据,只有 1000 多个用户,而且一个用户平均 1 万个消费明细,看起来不像真实数据)。

在这样一个两表数据相差较大的特殊情况下,plsql 写法确实是比分析函数的写法要高效 这个改写非常巧妙

我们再来分析一下这两种改写的优缺点:

1、plsql 的改写方式,适合在 t_customer 表比较小,而且 t_customer 和 t_trade 两表的记录数比例比较大的情况下,执行效率才会比分析函数的改写高一些。在本例中,如果 t_customer 表的记录数是 10 万,那么分析函数的写法反而要比 plsql 的写法快上几十到上百倍。

3、plsql 这种改写的前提是必须存在 t_trade 表 cstno + trade_date 两字段的联合索引。而分析函数的改写就不需要任何索引的支持。

4、对于 t_trade 这种千万记录级别的表,使用分析函数的写法可以通过开启并行来提速;plsql 的改写,如果要提高效率,需要先将 t_customer 表按 cstno 分组,用多个 session 并发执行。

我们再来看看,陈老师的这段 plsql,是不是可以用单个 sql 来实现,我做了一个尝试,SQL 代码如下:

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

执行计划大致如下:

改写函数提高 SQL 效率的研究

这种写法也是需要 t_trade 表存在 cstno+trade_date 联合索引(IDX_T_TRADE),而且 T_customer 表的数据量远低于 T_trade。

根据执行计划,这个 sql 的执行效率应该比 plsql 写法的效率不相上下。

总结:

SQL 优化,除了要避免低效的 SQL 写法,主要还是要看表的数据量与数据分布情况,plsql 的改写方法,在少数比较特殊的情况下会体现出较高的效率,在某些数据分布的情况下,效率可能还不如原 SQL。但是,优化思路非常值得借鉴。

而分析函数的改写方式,则不论数据如何分布,都会比原 SQL 要高效,通用性更强。

对于本例改写前的 SQL,应该还有很多开发人员和 DBA 在使用,在了解了分析函数的使用方法后,原 SQL 的低效写法就应该被彻底抛弃了。

最后的 plsql 改写成单 SQL,逻辑看起来比较复杂难懂,一般不会用到这样的改写,大家了解一下就好了。

还是那句话,优化无定式,优化器是死的,人脑是活的,只有掌握了原理,才能让 SQL 执行效率越来越高。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计1856字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7987768
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...
终于收到了以女儿为原型打印的3D玩偶了

终于收到了以女儿为原型打印的3D玩偶了

终于收到了以女儿为原型打印的 3D 玩偶了 前些日子参加某网站活动,获得一次实物 3D 打印的机会,于是从众多...
如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
在Windows系统中通过VMware安装苹果macOS15

在Windows系统中通过VMware安装苹果macOS15

在 Windows 系统中通过 VMware 安装苹果 macOS15 许多开发者和爱好者希望在 Window...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛 NAS-11:咪咕视频订阅部署全攻略 前言 在家庭影音系统里,NAS 不仅是存储中心,更是内容...
国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号 AI 知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率 大家好,我是星哥,...