SQL中应尽量避免在where子句中使用or来连接条件和使用or影响性能的解决办法

从梯度泄露到数据复原:DLG与iDLG算法实战解析 本文深入解析了DLG与iDLG算法在梯度泄露与数据复原中的实战应用,揭示了联邦学习中的隐私风险。通过详细代码示例和实验数据,展示了如何从梯度中复原原始训练数据,并探讨了梯度压缩、差分隐私等防御措施。文章特别强调了iDLG算法在标签破解中的高效性,为AI安全领域提供了重要参考。 阅读详情

近期做了一个存储过程,执行时发现非常的慢,竟然需要6、7秒!

经排查,发现时间主要都耗在了其中一段查询语句上。这个语句用于查出结构相同的两个表中,其中两个字段的任一个字段数据相同的记录。

例如,A表的结构如下所示:

--会员表
CREATE Table Member
(      
    MemberID int,              --会员ID 
    MemberName varchar(50),    --会员姓名
    MemberPhone varchar(50)    --会员电话
)
go

B表的结构与A表完全相同,假设表名为Member_Tmep。

现在Member表中有7000条不重复的数据,Member_Tmep表中有2000条数据,需要查出这两张表中,会员姓名或会员电话相同,但会员ID不相同的记录。

按照普通的逻辑,我一开始是这样写的:

select a.MemberID,a.MemberName,a.MemberPhone
    from Member a,Member_Tmep b 
    where (a.MemberName = b.MemberName or a.MemberPhone = b.MemberPhone) and a.MemberID <> b.MemberID
  

 

这条语句看上去逻辑很清晰,写出来也很简洁,但执行起来为什么却那么耗费时间呢?

虽然我不清楚这条语句错在哪里,但也想到试着用另一种方式来实现这个查询,于是我把这段查询语句改成了下面这样:

--查询出会员姓名相同但ID不同的记录
select a.MemberID,a.MemberName,a.MemberPhone
    from Member a
    inner join Member_Tmep b on a.MemberName = b.MemberName and a.MemberID <> b.MemberID

union

--再查询出会员电话相同但ID不同的记录,进行合并
select a.MemberID,a.MemberName,a.MemberPhone
    from Member a
    inner join Member_Tmep b on a.MemberPhone = b.MemberPhone and a.MemberID <> b.MemberID

这样再执行,秒秒钟就执行完了。

其实之前也写过很多类似第一种写法的SQL语句,一直没出过这种问题,那是因为数据量没有这么大。

应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。而改用union之后,性能就大大提高了。

使用"union all"的性能比"union"更高一些。因为当SQL 语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序。 如果用UNION ALL替代UNION, 这样排序就不是必要了,效率就会因此得到提高。

而在上面这个例子里使用"union"而不是"union all",是因为“会员姓名相同但ID不同的记录”和“会员电话相同但ID不同的记录”可能有重复,使用"union"可以去掉重复的记录。

其实这个道理之前也有看到过,但是在编写语句的时候经常习惯性的就用了简洁的or语句,慢慢也就忘了这回事了。。。

 

除了上述这种情况,还有一种常见的会使用or语句的情景,那就是:查询出某字段的值等于某几个特定值的记录。

例如,需要查询出会员姓名为“张三”、“李四”的记录。我们可能会这样写:

select * from Member where MemberName = '张三' or MemberName = '李四'

通常情况下,这种写法是看不出有什么问题的,但是在数据量很大的情况下,一样会非常影响执行速度。

还有一种写法是使用in语句,例如下面这样:

select * from Member where MemberName in ('张三','李四')

但是有些说法认为in语句一样会导致全表扫描。in和not in的写法都是应该尽量避免的。

如果需要查询的特定值是连续的数值范围,如90--100,可以改用bwteen...and语句。例如:

select * from Member where MemberID between 90 and 100

如果无法使用bwteen...and,那么仍然需要使用union方法了,如:

select * from Member where MemberName = '张三' 
union all
select * from Member where MemberName = '李四'

这里因为会员姓名为“张三”的和为“李四”的不可能有重复记录,因此可以使用性能更高的union all,而不是union了。

人工智能面试总结-Python B站:啥都会一点的研究生 公众号试读:啥都会一点的研究生 目录说说Python程序运行过程?说说Python的作用域?说说Python的数据结构?说说Python中可变与不可变类型?说说进程与线程?说说Python中的多线程?说说Python中的多进程?说说Python互斥锁与死锁?说说Lambda?说说Python的深拷贝与浅拷贝?说说Python多线程是否能用多个CPU,为什么?说说Python垃圾回收机制?说说Python里的生成器?说说迭代器与生成器的区别?说说Python 列表的 del,rem. 阅读详情

相关推荐

2025年最新Cesium学习示例:Cesium-Examples

2025年最新Cesium学习示例:Cesium-Examples

2403_88103571的博客 1008

mysql sql where or_SQL -------- WHERE子句与AND,OR和NOT运算符结合使用。

AND, OR and NOT 与运算符中的且或非的意思相同WHERE子句可以与AND,OR和NOT运算符结合使用。and 表示 查询的语句必须全部包含and连接的两个或多个条件or 表示 查询的语句包含or连接条件中的其中一个not 表示 查询的语句中不包含not连接的条件表中数据:使用AND进行查询语法:select * from 表名 where 表中字段...

weixin_29056101的博客 5897

分享一个简单的迭代学习机器人双臂控制(MATLAB)

1 什么是迭代学习控制 迭代学习控制(iterative learning control,简称ILC)由Uchiyama于1978年首先提出,不过因为论文由日文撰写,影响不是很大。1984年,Arimoto等人用英文介绍了该方法。它是指不断重复一个同样轨迹的控制尝试,并以此修正控制律,以得到非常好的控制效果的控制方法。 迭代学习控制的特点是“在重复中学习”,通过反复的迭代修正,达到改善控制效果的目的。迭代学习控制的原理是根据系统前次运行所获得的输出误差信息,在控制过程中不断修正控制输入,随着迭代的进行,逐

weixin_45776027的博客 4483

where子句中使用 or 来连接条件的各种情况

1、只要是查询的列可以在二级索引找到,执行计划就是index,扫描索引树。找全部列那就是全表扫描。2、只要两个列是唯一索引或者查询的值占比很少就走两个索引,type是index_meger3、两个列其中一个查找不是唯一值或者占比很多,分两种情况1)查询的列在二级索引可以全部找到,type是index2)查询的列在二级索引上找不到,type是all。

zyjzyjjyzjyz的博客 3092

【图像超分】论文精读:Interpreting Super-Resolution Networks with Local Attribution Maps(LAM)

论文题目:Interpreting Super-Resolution Networks with Local Attribution Maps —— 用局部归因图解释超分辨率网络CVPR 2021!必读文章!必须会的可视化手段!很多文章中都会对比LAM!图像超分辨率 (SR) 技术发展迅速,受益于深度网络的发明及其连续突破。然而,众所周知,深度学习和深度神经网络很难解释。SR网络继承了这种神秘的性质,很少有作品试图理解它们。在本文中,我们对 SR 网络进行了归因分析。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 546

还原 Windows 环境变量的默认值

有时候,我们可能需要还原环境变量的默认值,以修复可能的配置问题或恢复系统的正常运行。如果您只想还原某个特定的环境变量,可以跳过删除其他变量的步骤,仅删除需要还原的变量即可。在“环境变量”对话框中,继续向下滚动到“系统变量”部分。请注意,在执行以下步骤之前,您应该备份当前的环境变量设置,以便在需要时可以还原。在删除所有需要还原的环境变量后,点击“确定”按钮关闭“环境变量”对话框。在“用户变量”部分,选择需要还原的变量,然后点击“删除”按钮。在“高级”选项卡下方的“环境变量”部分,点击“环境变量”按钮。

PvDeveloper的博客 6341

SQL查询时,如何对where后的or进行优化

SQL查询时,如何对where后的or进行优化 大家都知道,在sql查询的过程中,where带有or条件,且条件比较复杂的时候,sql的查询速度明显会降低,比如我在实际应用中就遇到这样一个问题:写了一个条件带or的复杂sql,发现查询速度远不如人意,一条10000条数据不到的表,居然需要花费近4s的时间,显然是不符合要求的(至于为什么会这么慢,这个在此就不做过多解释),这时候就要考虑到怎样进行优化...

abc_ABC123A的博客 7890

一张图读懂 SAP S/4HANA Cloud 与 SAP BTP 的扩展版图

本文解析了SAP S/4HANA Cloud的扩展技术谱系,提出扩展应分为on-stack(系统内)和side-by-side(并行)两种路径,并沿着低代码到专业代码的能力梯度进行分层。on-stack扩展包括面向业务人员的Key User Extensibility和面向开发者的Developer Extensibility,强调贴近核心业务对象;side-by-side扩展则依托SAP BTP平台,提供SAP Build低代码工具、CAP开发框架和ABAP云环境三种方案,支持解耦创新。文章通过五个真实案

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 248

SQL 一个【OR】属性给你带来了怎样的麻烦

关于 数据库 or 的用法,就不说了 讲讲OR对数据库性能有多大的杀伤力,以后线上的项目如果是数据量很大的表,一定不要用OR来查询 今天在工作的时候,同事遇到了SQL优化的问题,让我帮忙看看,之后一个长达16秒的查询,优化到不到一秒! SQL: 用时:五秒 我检查一下 JK_Customer 这张表的...

aagj72736的博客 316

Bert+CNN文本分类(含代码实现)

一、什么是CNN? CNN的特点: (1)特定特征位移不变性 (2)特征缩放不变性 2. CNN模型构造过程 2.1 Convolution(卷积) (1)获取关键特征(减少参数) (2)共享权重(再次减少参数) 2.2 Max Pooling(池化) 2.3 Flatten 向量转换为如图所示可以进入全连接层的向量模式 3. TextCNN 上图可理解为: 通过不同的size(如上图2、3、4等),上图红色代表 size=2,黄色...

Python,数据分析,机器学习,深度学习 1万+

STM32实战开发(121):基于STM32的智能电导率检测系统设计与实现

STM32系列是由意法半导体(STMicroelectronics)推出的32位微控制器。STM32系列基于ARM Cortex-M处理器架构,具有高性能、低功耗、丰富的外设接口和强大的开发支持库。STM32的低功耗特性使其在嵌入式系统中非常受欢迎,特别是在便携式设备和传感器网络中。

2201_76125393的博客 1041

Oracle 尽量避免在 SQL语句的WHERE子句中使用函数

-- Start 在 WHERE 子句中应该尽量避免在列上使用函数,因为这样做会使该列上的索引失效,影响SQL 语句的性能。即使该列上没有索引,也应该避免在列上使用函数。考虑下面的情况: CREATE TABLE EMPLOYEE ( NAME VARCHAR2(20) NOT NULL,---姓名 REGISTERDATE TIMESTAMP---注册时间 ); 现在要

千里之行始于足下 7060

【视频监控国标GB/T28181】无人机的视频图传技术

然而,随着无人机市场的不断发展和无人机视频图传技术的迅速进步,一些厂家正积极探索更多的传输方式。如今,一些大疆无人机已经具备了4G辅助图传功能,这意味着它们需要在无人机上安装相应的SIM卡,并在有移动互联网信号的情况下,通过互联网进行视频图传。这种技术的应用,不仅提高了无人机的操作灵活性,也使得无人机在各个领域的应用更加广泛。在使用时,用户需时刻注意无人机的飞行距离。在无人机图传系统中,OFDM技术的运用更是如虎添翼,显著增强了视频传输的品质与稳定性,尤其在错综复杂的电磁环境中,更能凸显其不可替代的优势。

开源物联网项目商业化作者 5658

mysql or 性能降低_SQL中使用or影响性能的解决办法

近期做了一个存储过程,执行时发现非常的慢,竟然需要6、7秒!经排查,发现时间主要都耗在了其中一段查询语句上。这个语句用于查出结构相同的两个表中,其中两个字段的任一个字段数据相同的记录。例如,A表的结构如下所示:--会员表CREATE TableMember(MemberID int, --会员IDMemberNamevarchar(50), --会员姓名Member...

weixin_30093159的博客 1591

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

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

尽量避免在SQL语句的WHERE子句中使用函数

----start     在SQL语句的 WHERE 子句中应该尽量避免在字段上使用函数,因为这样做会使该字段上的索引失效,影响SQL语句的性能。即使该字段上没有索引,也应该避免在字段上使用函数。考虑下面的情况: CREATE TABLE USER ( NAME VARCHAR(20) NOT NULL,---姓名 REGISTERDATE TIMESTAMP---注册时间 );

千里之行始于足下 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

MySQL - 如何提高SQL的查询效率(where条件优化)

以上优化,包括不限于Where条件语句优化,以及在where时索引如何使用,哪些失效以及避免产生的问题的总结。不仅仅适用于MySQL,本文仅根据 MySQL 为栗子。

m0_60154368的博客 3035

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

详细讲解SELECT语句的使用、WHERE子句的运用、逻辑运算符在WHERE子句中的应用。

通过使用SELECT语句和WHERE子句,可以灵活地从数据库中检索和筛选数据。WHERE子句中的逻辑运算符使得查询条件更加复杂和精确,从而满足各种数据检索需求。

破损的天堂鸟博客 1184

mysql+or+影响性能_SQL中使用or影响性能的解决办法

近期做了一个存储过程,执行时发现非常的慢,竟然需要6、7秒!经排查,发现时间主要都耗在了其中一段查询语句上。这个语句用于查出结构相同的两个表中,其中两个字段的任一个字段数据相同的记录。例如,A表的结构如下所示:--会员表CREATE Table Member(MemberID int, --会员IDMemberName varchar(50), --会员姓名Memb...

weixin_42300302的博客 834

SQL语句执行顺序对性能的影响是什么?

在多表查询中,表的连接顺序会影响查询性能。通常建议先连接较小的表,因为这样可以减少后续步骤所需的行数,从而提高性能。Oracle解析器按照从右到左的顺序处理FROM子句中的表名,因此将记录条数最少的表放在最后可以优化性能。:在WHERE子句中,能使结果集最小的条件应放在最左边或最右边,这取决于具体的数据库优化器的工作方式。有些情况下,将条件放在最右边可以提高性能,因为SQL执行是按从右到左进行筛选的。:尽量避免全表扫描,因为这会显著增加查询时间。

破损的天堂鸟博客 1265

《深入解析SQL中的WHERE子句用法、示例及最佳实践》

IN运算符则用于匹配列表中的任意值,例如查询部门为“销售”或“市场”的员工:SELECT FROM employees WHERE department IN ('销售', '市场');=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等。为提升WHERE子句的查询效率,应尽量避免在条件列上进行函数操作(如WHERE YEAR(create_time)=2023),这会阻止索引的使用。例如,在SELECT语句中,WHERE子句能够筛选出满足特定条件的行,而不是返回整个表中的所有数据。

silverfox13881548512的博客 369

ORACLE SQL语句优化,性能优化,效率优化。

文章目录SQL语句优化概述SQL语句优化是提高性能的重要环节SQL语句优化的一般性原则常见SQL优化方法共享SQL语句减少访问数据库的次数SELECT语句中避免使用`*`WHERE子句中的连接顺序利用DECODE函数来减少处理时间删除重复记录用truncate代替delete(当需要删除全表数据时建议使用truncate)用where子句替换having子句SQL中索引列使用注意问题PL/SQL优...

InJra_p的博客 9896

图解面试题:如何提高SQL查询的效率?

【题目】我们公司的数据量非常大,需要的不仅仅是提取数据,要了解SQL方案优化的。一般在写SQL时需要注意哪些问题,可以提高查询的效率?【解题思路】数据量大的情况下,不同的SQL语句,消耗的时间相差很大。按下面方法可以提高查询的效果。1. select子句中尽量避免使用*select子句中,*是选择全部数据的意思。比如语句:“select * from 成绩表”,意思是选择成绩表中所有列的数据。在我...

公众号(猴子数据分析) 2万+

常见的SQL SERVER错误————WHERE子句的函数

继续我的SQL SERVER常见错误系列,来看更多的T-SQL错误。错在哪里?如果你看到这样一个查询语句,你能看出问题来吗?select  o.OrderID  , o.CustomerID  , o.Qtyfrom Orders owheredatepart( yyyy, o.OrderDate)='2010'如果该表有1000条数据,这可能没有问题;但是该表若是有1,000,000条数据,那么这就有问题了。为什么呢?让我们来查看他们的执行计划。该表有1000行数据,该查询没有使用索引查询OrderDat

shizheyangde的专栏 1030

尽量避免在SQL语句中使用LIKE

----start     前面,我们介绍了 尽量避免在SQL语句的WHERE子句中使用函数,因为这样做会使该字段上的索引失效,影响SQL语句的性能。基于同样的道理,我们也应该避免使用LIKE。考虑下面的情况: CREATE TABLE USER ( NAME VARCHAR(20) NOT NULL,---姓名 MYNUMBER VARCHAR(18)---身份证号码 );  现在

千里之行始于足下 4204

sql server尽量避免滥用影响性能的标量函数

相信很多新手学了 函数的用法就不可避免的想把学到的东西用起来,然而这个函数使用却有坑, 在实际用的时候我发现一个简单的计算封装 ,不用函数和用函数执行耗时差太多了。 能避免列上进行函数则尽量避免,这是在实际上遇到的坑 ,封装成函数和直接计算效果差太多。 行中函数(Scalar-valued functions)在 SQL Server 中的性能通常较差,主要原因是它们在查询执行过程中被视为"黑盒"...

情随事迁个人博客 805

oracle中where中使用函数,Oracle 尽量避免在 SQL语句的WHERE子句中使用函数

-- Start在 WHERE 子句中应该尽量避免在列上使用函数,因为这样做会使该列上的索引失效,影响SQL 语句的性能。即使该列上没有索引,也应该避免在列上使用函数。考虑下面的情况:CREATE TABLE EMPLOYEE(NAME VARCHAR2(20) NOT NULL,---姓名REGISTERDATE TIMESTAMP---注册时间);现在要求你把2009-9-24...

weixin_42500156的博客 839
上一篇: 浏览器cookie、sessionStorage和localStorage的区别
下一篇: Redis事务管理
shadow_zed
博客等级 码龄10年 6289粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值