子查询性能优化

5、SQL 查询:连接、子查询与性能优化 本文深入探讨了SQL查询中的连接与子查询技术,包括非等值连接、使用连接修改数据、性能优化策略等内容。通过实际案例分析了如何高效地进行数据查询与操作,并提供了子查询与连接的相互转换方法及选择建议。此外,还涵盖了量化谓词、NULL值处理以及常见性能问题的解决方案,帮助读者全面掌握SQL查询与优化的核心技能。 阅读详情

子查询是一个 SELECT 查询,它嵌套在 SELECT、INSERT、UPDATE、DELETE 语句或其它子查询中。

任何允许使用表达式的地方都可以使用子查询,子查询可以使我们的编程灵活多样,可以用来实现一些特殊的功能。但是在性能上,

往往一个不合适的子查询用法会形成一个性能瓶颈。如果子查询的条件中使用了其外层的表的字段,这种子查询就叫作相关子查询。

相关子查询可以用IN、NOT IN、EXISTS、NOT EXISTS引入。 关于相关子查询,应该注意:

(1)

A、NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。

比如: SELECT PUB_NAME FROM PUBLISHERS WHERE PUB_ID NOT IN (SELECT PUB_ID FROM TITLES WHERE TYPE = 'BUSINESS') 可以改写成: SELECT A.PUB_NAME FROM PUBLISHERS A LEFT JOIN TITLES B ON B.TYPE = 'BUSINESS' AND A.PUB_ID=B. PUB_ID WHERE B.PUB_ID IS NULL

(2)

  1. SELECT TITLE FROM TITLES  
  2. WHERE NOT EXISTS  
  3. (SELECT TITLE_ID FROM SALES  
  4. WHERE TITLE_ID = TITLES.TITLE_ID) 

可以改写成:

  1. SELECT TITLE  
  2. FROM TITLES LEFT JOIN SALES  
  3. ON SALES.TITLE_ID = TITLES.TITLE_ID  
  4. WHERE SALES.TITLE_ID IS NULL 

B、 如果保证子查询没有重复 ,IN、EXISTS的相关子查询可以用INNER JOIN 代替。比如:

  1. SELECT PUB_NAME  
  2. FROM PUBLISHERS  
  3. WHERE PUB_ID IN 
  4. (SELECT PUB_ID  
  5. FROM TITLES  
  6. WHERE TYPE = 'BUSINESS') 

可以改写成:

  1. SELECT A.PUB_NAME --SELECT DISTINCT A.PUB_NAME  
  2. FROM PUBLISHERS A INNER JOIN TITLES B  
  3. ON B.TYPE = 'BUSINESS' AND 
  4. A.PUB_ID=B. PUB_ID 

(3)

C、 IN的相关子查询用EXISTS代替,比如

  1. SELECT PUB_NAME FROM PUBLISHERS  
  2. WHERE PUB_ID IN 
  3. (SELECT PUB_ID FROM TITLES WHERE TYPE = 'BUSINESS') 

可以用下面语句代替:

  1. SELECT PUB_NAME FROM PUBLISHERS WHERE EXISTS  
  2. (SELECT 1 FROM TITLES WHERE TYPE = 'BUSINESS' AND 
  3. PUB_ID= PUBLISHERS.PUB_ID) 

D、不要用COUNT(*)的子查询判断是否存在记录,最好用LEFT JOIN或者EXISTS,比如有人写这样的语句:

  1. SELECT JOB_DESC FROM JOBS  
  2. WHERE (SELECT COUNT(*) FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)=0 

应该改成:

  1. SELECT JOBS.JOB_DESC FROM JOBS LEFT JOIN EMPLOYEE  
  2. ON EMPLOYEE.JOB_ID=JOBS.JOB_ID  
  3. WHERE EMPLOYEE.EMP_ID IS NULL 
  4. SELECT JOB_DESC FROM JOBS  
  5. WHERE (SELECT COUNT(*) FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)<>0 

应该改成:

  1. SELECT JOB_DESC FROM JOBS  
  2. WHERE EXISTS (SELECT 1 FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID) 
华为GaussDB数据库:关联子查询与性能优化详解 GaussDB关联子查询技术解析 摘要:本文详细剖析了GaussDB中关联子查询的核心机制与应用方法。关联子查询通过嵌套循环方式执行,其性能与外部表行数和子查询复杂度直接相关(时间复杂度O(M×N))。文章系统梳理了四类关联子查询(标量、列、行、表)的定义与适用场景,通过实际案例展示了其在WHERE、SELECT、FROM子句中的语法结构。高级应用部分探讨了多层嵌套、CTE结合、窗口函数等复杂用法。性能优化方面,GaussDB采用物化、去关联化、半连接转换等策略提升效率。文中包含执行计划解析和成本估算公式, 阅读详情

相关推荐

数据库性能优化(sql优化)_子查询01_yxy

子查询优化思路详解

yxy___的博客 143

养成好的sql习惯(2)

From:http://database.51cto.com/art/201105/265497_5.htm 六、子查询的用法 子查询是一个 SELECT 查询,它嵌套在 SELECT、INSERT、UPDATE、DELETE 语句或其它子查询中。 任何允许使用表达式的地方都可以使用子查询,子查询可以使我们的编程灵活多样,可以用来实现一些特殊的功能。但是在性能上,...

weixin_34050519的博客 225

Mysql数据库性能优化之子查询

主要介绍了Mysql数据库性能优化之子查询的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

MySQL 子查询优化如何做?

本文分析了MySQL子查询效率低下的原因,主要包括临时表创建销毁的资源消耗、无法添加索引导致查询效率低以及大数据集影响外层查询性能。针对这些问题,提出了两种优化方法:一是将子查询拆分为多表连接查询,通过合理选择驱动表和使用索引提高匹配速度;二是在必须使用子查询时,为内部查询表的查询字段添加索引或联合索引,以提升内部查询效率。这两种方法都能有效改善子查询性能,其中多表连接查询的优化效果更为显著。

m0_70325779的博客 1505

别再混淆了!一张图看懂SAP特殊采购类30/40/70/80的区别与选型指南

本文深度解析SAP特殊采购类30/40/70/80的核心逻辑与业务影响,通过对比框架和真实案例帮助用户掌握其适用边界。重点介绍委外加工(类型30)、工厂间转移(类型40/70)及计划与执行分离(类型80)的配置要点与常见问题,提供选型决策树和实施检查清单,助力企业优化供应链管理。

weixin_26938645的博客 450

求一个点到任意两个点所在直线距离 C#代码公式

求点C(X0,Y0) 到点A(x1,y1)和点B(x2,y2)所在直线的距离 1.已知任意两个点,求这两个点所在直线 已知点A(x1,y1),点B(x2,y2) 设直线上另外任意一个点为(x,y) 那么 (x-x1)/(y-y1) = (x2-x1)/(y2-y1); 整理后得方程: (y2-y1)x + (x1-x2)y + (y1-...

qq_29434987的博客 4492

遇到SQL 子查询性能很差?其实可以这样优化

SQL 允许您在可能出现表或列名称的几乎任何地方使用子查询。您所要做的就是用括号将查询括起来,例如,然后您可以在任意表达式中使用它。这使得 SQL 成为一种强大的语言,但是可能难以阅读。但我不想讨论 SQL 的美或丑。在本教程中,我们来看看如何编写出表现良好的子查询。让我们先从简单开始,稍后再来了解更令人惊讶和复杂的话题。

1178

告别F5失灵!手把手教你为Cursor配置.Net Core控制台项目专属调试环境

本文详细指导如何在Cursor编辑器中为.Net Core控制台项目配置专属调试环境,解决F5失灵等常见问题。从调试器选择到launch.json配置,再到高级调试技巧,帮助开发者高效搭建完整的调试工具链,提升开发效率。

weixin_28834765的博客 285

mysql大量子查询会有什么问题

使用 MySQL 中的大量子查询可能会导致一些问题,包括: 性能问题:大量子查询可能会使数据库的性能变差,因为它们需要进行额外的计算来执行。 可读性问题:大量子查询的代码可能难以阅读和维护,因为它们可能很长并且难以理解。 错误率问题:大量子查询的代码可能容易出现错误,因为它们的逻辑可能很复杂。 可维护性问题:大量子查询的代码可能难以维护,因为它们可能很长并且难以理解。 建议在使用大量子...

weixin_35757191的博客 650

DIY玩家必备:用SSS1623芯片打造高性价比USB麦克风(附完整电路图)

本文详细介绍了如何利用SSS1623芯片DIY高性价比USB麦克风,包括元件选型、电路设计、PCB布局及调试技巧。通过完整的电路参考设计和实用建议,帮助电子爱好者打造专业级录音设备,实现免驱动即插即用功能。

weixin_29166013的博客 238

Power Automate 最常用的十大场景以及解决方案

3.2 获取指定主题含有附件邮件,然后读取csv附件内容,插入数据库,调度执行存储过程,最后通过Power automate 发送paginated report 特殊格式报表给发件人。Power Automate 作为微软推出的自动化工作流工具,其适用场景非常广泛,尤其在数据库查询自动化方面能显著提升效率。2.8发送邮件,把生成csv文件当作附件,把生成html当作邮件内容在邮件boty展示。3.1 读取数据库数据,定时发送预警邮件并抄送附件和展示内容在邮件中。:已有微软产品栈,需快速实现部门级自动化。

qq_24388807的博客 3686

SQL优化 - 子查询

本文相关sql执行环境为 mysql8.0.26 linux版。

vonlinee的博客 1407

康耐视visionpro-CogBlobTool工具详细说明

康耐视visionpro-CogBlobTool工具详细说明

视觉人机器视觉的博客 1724

用JOIN替代子查询的查询性能优化

通过合理改写,JOIN操作可减少90%以上的资源消耗9。建议结合具体数据库特性(如达梦的优化HINT10)进行深度调优。关联子查询会导致外层每行数据触发一次子查询,时间复杂度为O(M*N)MySQL等数据库可能生成临时表存储中间结果,增加I/O压力。子查询中的关联条件可能无法有效利用复合索引。‌:某案例改写后性能提升487516.45%。

数据狐(DataFox19970-108-018) 531

079、LVGL基础控件:消息框(Msgbox)

《LVGL消息框控件深度解析与避坑指南》 文章深入剖析了LVGL消息框控件的核心特性和使用技巧。消息框本质是带按钮的模态容器,而非独立窗口。作者分享了创建消息框的正确姿势、标题/内容设置方法、安全的按钮事件处理方式(避免直接调用close函数导致栈溢出),并详细介绍了模态/非模态实现、样式自定义、动态更新等实用技巧。针对常见问题如内存管理、按钮数量限制、动画效果等给出了专业建议,特别强调了消息框作为用户交互关键环节的优化重要性,建议通过异步删除、合理父对象选择等方式提升稳定性。文章包含大量实际项目经验总结,

m0_50546716的博客 153

微信小程序:使用mqtt手机屏幕锁屏后导致中断问题,让mqtt在手机黑屏后依然能保持连接及持续后台运行接收或处理任务,详解微信小程序MQTT在应用退到后台或手机熄屏的情况下自动检测并重连【强制保活】

微信小程序切后台后MQTT连接无法维持,微信小程序MQTT一旦用户锁屏、切换到后台或手机熄屏,连接就会断开,导致无法继续监听和处理业务消息,微信小程序mqtt保活方案,微信小程序屏幕锁屏或息屏导致mqtt连接中断怎么办,如何解决MQTT不能黑屏持续连接的问题,微信小程序应用退到后台 MQTT连接断开问题解决,苹果ios手机,安卓手机,uniapp微信小程序mqtt断开怎么解决,后台应用怎么保活,uni-app中MQTT连接频繁断开如何解决?应用退到后台后MQTT连接断开以及常连接断连的问题,微信小程序、MQ

✅ 精选推荐文章 3026

MYSQL性能优化-in 子查询

MYSQL性能优化-in 子查询in里面的子查询,著名的老大难调优问题场景原来的情况之后的情况解释 in里面的子查询,著名的老大难调优问题 这个问题太有名了,不描述了,总之某些特定情况下,mysql自己优化的有问题,一个in查询的效率,可以比in里面的子查询 + 结果直接copy进行外部查询,低一个数量级。 场景 Post和Type多对多,Type本身是3级树,查询的时候要求查上级下推全部下级。 ...

farady的博客 1648

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

mysql 优化子查询_Mysql应用Mysql - 性能优化之子查询

MysqL应用MysqL - 性能优化之子查询,希望对您有用。如果有疑问,可以联系我们。@H_403_5@导读:当MysqL Server的连接线程接收到Client发送过来的sql请求后,会经过一系列的分解Parse,进行相应的分析,然后MysqL会通过查询优化器模...MysqL Server的连接线程接收到Client发送过来的sql请求后,然后MysqL会通过查询优化器模块,根据该sql所...

weixin_42660494的博客 172

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

3个案例掌握gf框架子查询:从入门到性能优化

你是否在使用gf框架的数据库查询时遇到过复杂条件组合的难题?是否因子查询使用不当导致性能瓶颈或逻辑错误?本文将通过3个实战案例,带你系统掌握gf框架中WhereExists、WhereIn和嵌套查询的正确用法,结合框架源码解析底层实现,帮你写出高效、可维护的数据库查询代码。 ## 子查询基础:框架API与使用场景 gf框架的gdb模块提供了完整的子查询支持,核心实现位于[database/gd...

gitblog_00921的博客 490

IN的相关子查询用EXISTS代替--sql2000性能优化

参考文章:SQL SERVER性能优化综述(很好的总结,不要错过哦) 数

twtiqfn的专栏 1327

Oracle性能优化:FILTER中,子查询执行的次数

文章摘要: 本文探讨了Oracle性能优化中FILTER操作下子查询的执行次数问题。作者通过创建测试表htz1、htz2、htz3,并建立索引进行实验验证。测试结果显示:当驱动表无重复值时,FILTER执行50,068次而索引仅执行22,962次;当存在重复值时,执行计划显示需要处理更多数据。文章强调子查询执行次数直接影响SQL性能,建议通过执行计划分析优化查询效率。实验数据可在博客(www.htz.pw)查看完整代码效果,欢迎加入ORACLE技术交流群(17115662)讨论。 (字数:149)

提供数据库技术支持(系统优化,故障处理,安装升级,数据恢复等) 463

MySQL复杂SQL性能优化实战:多表联查与子查询的高效方法

摘要:SQL多表联查(JOIN)是数据库查询的核心技术,主要包括五种连接类型:INNER JOIN返回匹配行,LEFT/RIGHT JOIN保留左/右表全部数据,FULL JOIN保留两侧数据(MySQL需用UNION实现),CROSS JOIN产生笛卡尔积。多表连接可连续使用JOIN子句,自连接用于处理层次关系。子查询分为标量(单值)、列(单列多行)和行(单行多列)三种类型,可嵌套在SELECT、FROM、WHERE等子句中,常用IN、ANY等运算符处理。这些技术能有效实现复杂数据关联查询需求。

shitou的博客 1318

MySQL子查询性能优化:从10秒到1秒的改写技巧。

先看原始需求:从`e_cons_snap`表中删除满足“关联`c_cons`表中`status_code='9'`且`mr_sect_no='1'`”条件的数据。这意味着:子查询不是“先执行完得到结果,再和外表关联”,而是每遍历外表的一条数据,就执行一次子查询——相当于做了“百万次循环+子查询”,性能直接拉垮。1. 先执行`c_cons`表(b表),通过`status_code`和`mr_sect_no`的过滤条件,只得到**1条记录**;二、慢查询根源:执行计划的“依赖子查询”

会变好的 慢一点也没关系 399

5分钟搞懂TiDB子查询:从嵌套执行到性能优化

你是否在使用TiDB时遇到过子查询(Subquery)执行效率低下的问题?是否想知道为什么同样的SQL在MySQL和TiDB中表现迥异?本文将通过实际案例和执行原理,带你彻底掌握TiDB子查询的执行机制,学会用`EXPLAIN`分析瓶颈,并通过3个实用技巧提升查询性能。 ## 子查询执行:TiDB的"嵌套计算"模型 TiDB作为分布式数据库,对SQL标准中的子查询(嵌套在SELECT、INSE...

gitblog_00619的博客 394

MySQL 子查询性能优化 – EXISTS、IN 和 JOIN 的实战对比

在实际的 MySQL 查询优化中,选择合适的查询方式对于提升性能至关重要。

秋元的博客 1575
上一篇: Mysql查询优化
下一篇: mysqladmin命令详解
OnePiece_Sky
博客等级 码龄15年 9粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值