尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

一次优化sql的实践

一次优化sql的实践
📅 发布时间:2026/6/17 21:14:45
这么一条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

 

相关新闻

  • Linly-Talker支持多实例并行,服务器资源最大化利用
  • 【博士论文复现】【阻抗建模、验证扫频法】光伏并网逆变器扫频与稳定性分析(包含锁相环电流环)(Simulink仿真实现)
  • Linly-Talker语音抗延迟设计:网络波动下的稳定表现

最新新闻

  • Gemini 3 Pro工程化实战:多模态理解与结构化API集成指南
  • 2026年台州本地企业GEO工具推荐:企业选型前先看这7个核心能力 - 子柔传媒
  • 电瓶车托运专线价格表2026 长途跨省多少钱一单 - 快递物流资讯
  • Claude Opus 4.7:一套可复用的高阶调用范式
  • 金价暴涨下的“避坑指南”:乐平人手上的闲置黄金,这样卖才能多赚30%! - 衡金阁
  • 2026上海本地全屋定制爱格授权更新收录,四家官方认证门店实地走访记录 - 设计本

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号