当前位置: 首页 > news >正文

一次优化sql的实践

这么一条sql
SELECT tt
,           nn
,           cc
FROM
(SELECT A.tt,           B.nn,           C.cc,           RANK() OVER (PARTITION BY C.ff, C.gg ORDER BY C.hh) AS RFROM   A LEFT JOIN B ON a.mm = B.mmLEFT JOIN C ON A.ff = C.ff AND A.gg = C.gg
) T
WHERE T.R < 2

运行10分钟还出不来,显然有问题。

首先想到的是加索引,给C表加了个索引,涵盖ff, gg, 和hh字段,没用。

问了ai后,改成

SELECT A.tt
,           B.nn
,           T.cc
FROM   A 
OUTER APPLY (SELECT C.cc,  RANK() OVER (PARTITION BY C.ff, C.gg ORDER BY C.hh) AS R
FROM C
WHERE C.ff = A.ff AND C.gg = A.gg
) T
LEFT JOIN B ON a.mm = B.mm
WHERE T.R < 2

1秒就出来了。问题解决了。但原因是什么呢?
C表很大,有将近1亿条数据,A表有几百万条数据,表连接耗费了大量时间。而用outer apply,将相对较小的A表的每条数据在C表里找到匹配,就快了许多。这个例子的启示是,如果表的记录很多,连接的开销是很大的,rank()或类似的函数开销也很大,可以考虑用outer apply来代替表连接。一般来说,sql鼓励用集合运算,而outer apply有点类似游标操作,本来直觉上好像不好。但是,在数据量很大的情况下,连接等集合操作开销很大,反而不如将较小的一个数据集拿出来,一条条记录去大表中找匹配,性能要好得多。
继续优化这个sql,虽然主要问题解决了,但还有优化的余地。首先,PARTION BY是多余的,可以去掉,其次,这里没必要用RANK(),可以改成ROW_NUMBER(),性能也好一些,最后。连ROW_NUMBER()也没必要用,直接用TOP就可以了,最后改成

SELECT A.tt
,           B.nn
,           T.cc
FROM   A 
OUTER APPLY (SELECT TOP 1 C.cc FROM CWHERE C.ff = A.ff AND C.gg = A.ggORDER BY C.hh
) T
LEFT JOIN B ON a.mm = B.mm

 

http://www.jsqmd.com/news/116259/

相关文章:

  • 一次优化sql的实践
  • 数字人直播带货合规提醒:必须标明AI身份
  • 用Linly-Talker生成律师咨询视频?法律科技新动向
  • Linly-Talker支持多实例并行,服务器资源最大化利用
  • QSFP、SFP、CFPx
  • BUUCTF-[ZJCTF 2019]NiZhuanSiWei
  • Electerm(桌面终端模拟软件)
  • 用Linly-Talker生成法律条款解读视频?普法教育新形式
  • 数字人会议主持:Linly-Talker在远程会议中的创新应用
  • 文本编辑器CudaText
  • AB Download Manager 下载管理器
  • Linly-Talker支持混合精度训练,降低显存消耗
  • Linly-Talker语音抗延迟设计:网络波动下的稳定表现
  • 8k双休和12k单休,选哪个?
  • 数字人版权登记建议:使用Linly-Talker产出内容的确权路径
  • 【顶级EI完整复现】【DRCC】考虑N-1准则的分布鲁棒机会约束低碳经济调度(Matlab代码实现)
  • 用Linly-Talker做企业宣传片?品牌传播的AI新路径
  • Linly-Talker语音能量检测:静音段自动裁剪功能说明
  • 软考 系统架构设计师系列知识点之面向服务架构设计理论与实践(21)
  • 2025年重庆大学计算机考研复试机试真题(附 AC 代码 + 解题思路)
  • 原生JavaScript vs 前端框架,2026年该怎么选?
  • 软考 系统架构设计师系列知识点之面向服务架构设计理论与实践(22)
  • ICT 测试程序
  • Linly-Talker支持CUDA 11.8,新版NVIDIA驱动完美兼容
  • 第61天(中等题 数据结构)
  • 一个人是否选择努力,并不是靠个人的主观意识决定的,而是环境和情绪
  • Linly-Talker语音中断恢复机制,确保对话连贯性
  • 浮点数的本质:为什么计算机无法精确表示0.1
  • 编程世界时间对象的最小公倍数(闲话Float-Time)
  • 智能家居中枢:Linly-Talker作为家庭AI管家的潜力