今天看到一个库的cpu告警,去看了下top sql就发现了一个奇葩的SQL。

不得不吐槽下,都2022年了,还有在索引列上用函数的写法。。

其实也很好理解这个SQL是希望查询时间列是当天(current_date)的,但是由于该时间列是timestamp类型的,而current_date的结果是date类型的,所以开发人员将这两个时间用函数进行了截断。

那这个SQL该怎么优化呢,可能大部分人第一反应是加个函数索引不就好了,不过说实话函数索引大部分都显得有些多余,尤其是该列上都已经存在一个索引了,那么我们有没有什么办法对这个SQL进行等价改写呢?

进行SQL等价改写关键其实在于了解需求,而这个SQL的需求很简单:获取时间是当天的数据。

因此该SQL可以改写为:

条件改成了r.occur_time >= current_date and r.occur_time < current_date+1,,改写完之后用上了索引,cost从289238降到了5,时间也是大大降低。

看上去不等的写法其实相等,说白了等价改写其实最主要的是了解需求!

这让我想到了之前一个十分经典的等价案例:

begin
select count(*) into v_cnt from t1 ;
if v_cnt>0
then  …A逻辑….
else
then  …B逻辑…..
End;

这个需求大致如下:

获取t1 表的记录数,判断是否大于0,如果大于0走A逻辑,否则就走B逻辑。 因此代码就如上所示来实现了,可真正的需求是这样吗?

其实应该是这样的:只要T1表有记录就走A逻辑,否则走B逻辑。

两者有区别吗?其实区别还是很大的,前者可是强调获取记录数,我们是不是一定要遍历整个表得出一个记录数才知道是否大于0?

真正需求的理解可以让我们这样实现,只要从T1表中成功获取到第一条记录,就可以停止检索了,表示该表有记录了,难道事实不是这样?

因此原先的SQL可以修改为:

begin
select count(*) into v_cnt from t1 where rownum=1;
if v_cnt=1
then  …A逻辑….
else
then  …B逻辑…..
End;

总结:

有的时候优化SQL了解需求也是一大捷径,需要考虑将需求最小化,具备少做事的意识乃是顶级优化。

从一个简单的SQL来聊聊等价改写相关推荐

  1. 一个简单的SQL注入攻击

    在上一篇博客中:http://blog.csdn.net/suwei19870312/article/details/7579667.讲了Client 端代码和Server端代码的交互. Client ...

  2. 震惊!阿里的程序员竟被一个简单的 SQL 查询难住了!

    作者 | 唐磊 责编 | Carol 来源 | 程序猿石头 封图 | CSDN 付费下载于视觉中国 最近工作上遇到一个"神奇"的问题,或许对大家有帮助,因此形成本文. 问题大概是, ...

  3. PLY库-实现最简单的sql语法的数据库

    本文通过PLY实现一个简单的sql库 本文主要简述一下,有关语法解析的库的使用,并使用改实例编写一个简单的模仿最基本的sql语句的数据库,本文代码仅供示例参考. 语法解析与上下文 语法解析是一个比较大 ...

  4. 还在用 AI 和机器学习?简单的 SQL 脚本就能替代!

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! [CSDN编者按]现在,AI和机器学习无疑是超级热门的技术,很多开发者也都闻风转向人工智能领 ...

  5. oracle向前推一个小时,oracle SQL里常用的时间函数,经典推荐

    oracle SQL里常用的时间函数,经典推荐 (2009-03-11 23:16:54) 标签: 杂谈 常用日期型函数 1.Sysdate 当前日期和时间 SQL> Select sysdat ...

  6. 使用ANTLR做一个简单的Python SQL语法解析器 - 推酷

    使用ANTLR做一个简单的Python SQL语法解析器 - 推酷 使用ANTLR做一个简单的Python SQL语法解析器 - 推酷 posted on 2016-11-14 13:11 lexus ...

  7. 用一个简单的例子说明SQL子查询

    SQL的子查询(subqueries) 用一个简单的例子来说明subqueries的应用. 现有两个表格,第一个表格名为student,第二个表格名为student_information. 第一个表 ...

  8. 聊聊高并发(十六)实现一个简单的可重入锁

    可重入锁指的是假设一个线程已经获得了一个锁,那么它能够多次进入这个锁,当然前提是线程须要先获得这个锁. 可重入锁是最常使用的锁.Java的内置锁就是可重入锁,使用synchronizedkeyword ...

  9. 10年+SQL性能优化专家谈SQL等价改写核心思想

    墨墨导读:2020数据技术嘉年华于11月21日落下帷幕,大会历时两天,来自全国各地的数据领域学术精英.领袖人物.技术专家.从业者和技术爱好者相聚北京,见证了个人的快速成长.技术的迭代进步.行业的蓬勃发 ...

最新文章

  1. order by居然不能直接在union子句中使用
  2. Java项目几个月能完成_c#项目转JAVA,第5个月,基本完成
  3. 微软360游戏机改服务器,战斗民族就是干高玩将Xbox 360改装成PC简直改装达人
  4. 关于lazyman你还应该知道这几件事
  5. python-appium520-2初步使用
  6. 关于华为S27000交换机在局域网中的一些简单配置
  7. python布尔类型运算_Python3 布尔类型
  8. Apache安装apr和apr-util作用
  9. 第一讲 OC简介及基本语法
  10. 图像评价常用指标(PSNR、SSIM、LPIPS 、FID、Recall)
  11. AWS学习日志之SAA
  12. CloudCompare使用说明
  13. 多元线性回归的缺陷_多元线性回归常见问题
  14. MT2601平台L1.MP9版本DWS配置方法
  15. 属于拼多多的巴别塔正在构筑
  16. MySQL-count(*)、count(1)、count(主键)、count(非索引列)、count(索引列)性能分析
  17. RocketMQ吐血整理
  18. 17.深入浅出:非正弦波发生电路——参考《模拟电子技术基础》清华大学华成英主讲
  19. 电脑游戏录屏哪个好用免费?这2款录屏软件,用过都说好!
  20. ZKFinger Live20R 版对接java - B/S(网络版)

热门文章

  1. JS之 获取日期方法
  2. 面条代码 vs. 馄沌代码
  3. 为何农历10月1号要祭祖上坟?原来有这么多讲究,你知道吗?
  4. nape.dynamics.InteractionFilter
  5. Eventide发布SplitEQ,工作方式与传统的均衡器根本不同
  6. 投资人说:多方抢投 4400 万美元,我们为何看好神策数据?
  7. 9本4月程序员新书,Python书就占了6本
  8. glib实现Socket通信
  9. 【论文翻译】基于图关注网络的异构网络类型感知锚链路预测
  10. 阿里邮箱(@aliyun.com):启用IMAP功能+邮箱密码登录