not in 语句使程充崩溃
以前一直以为优化在百万级的表中才会有意义,这次的事件改变了我的看法
两张表 组织架构表(Organise) 和 工资发放历史记录表 (WagePerMonthHis)
两张表通过 Organise.Item_id 和 WagePerMonthHis.OrgIdS 进行关联
Organise表(以下简称O表)中大约有6000条记录11个字段 ,WagePerMonthHis(以下简称W表)计有 125万条记录 和 25个字段
原程序中一段如下的语句
是查询所有不在W表的组织架构层级为2的记录
select OrgId as 公司编码,OrgName as 公司名称
from Organise
where OrgLev=2
and item_id not in
(select OrgidS from WagesPerMonthHis
where WagesYear='2010' and WagesMonth=
'01' Group by OrgidS,OrgNameS)
order by Orgid
语句执行要33秒之久,服务器的配置是比较高的:16核心4CPU,24G内存,且内存和CPU在执行时都没有出现瓶颈,开始以为是 (select OrgidS from WagesPerMonthHis
where WagesYear='2010' and WagesMonth=
'01' Group by OrgidS,OrgNameS) 这条语句执行缓慢所致,单独执行这条却发现执行速度很快,大约不到2秒就出来了,于是症结出来了,是not in 这个全扫描关键词带来的性能下降.最直接的是导致页面失去响应,一个关键功能使用不了.
试了not exist语句,发现效果是一样的,并不象网上所说可以提高很多性能.
于是重新优化语句如下
select a.OrgId as 公司编码,a.OrgName as 公司名称,a.item_id
from Organise a
left outer join (select distinct b.OrgIdS from WagesPerMonthHis b
where WagesYear='2010' and WagesMonth='01') as b
on a.item_id = b.OrgidS
where a.OrgLev = 2
and b.OrgIdS is Null
order by 公司编码
改用左外连接(其实左连接也可以)后,整个语句执行速度为400ms, 33秒与400ms 我想是很多人没想到的.
分享到:
相关推荐
在SQL查询中,`CASE WHEN`、`EXISTS`、`NOT EXISTS`以及`IN`和`NOT IN`是常用的操作符,它们用于处理复杂的条件判断和数据筛选。这些概念对于理解和编写高效的SQL语句至关重要,尤其是在数据分析和数据库管理中。 `...
标题 "Drools报错: The Eclipse JDT Core jar is not in the classpath" 提示了一个常见的编程问题,即在使用Drools规则引擎时,由于缺少Eclipse JDT(Java Development Tools)核心库,导致运行错误。这个问题涉及...
SQL语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句 SQL语句优化是数据库性能优化的重要方面之一。在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下,使用EXISTS...
首先,我们要理解"not in"操作符的基本概念。它是Python中的一个成员运算符,主要用来判断一个元素是否不在给定的集合内。当元素不存在于集合中时,"not in"返回True,反之则返回False。这种操作符常用于条件语句中...
在这个问题中,开发者遇到了一个常见的错误:“Name jdbc is not bound in this Context”,这通常意味着在Tomcat的环境中,指定的数据源没有被正确地绑定或配置。 要解决这个问题,首先需要在Tomcat的配置文件中...
在PHP开发过程中,有时会遇到"Operation not permitted"这样的错误,这通常是由于权限问题导致的。这个错误通常出现在尝试执行一些系统级别的操作,比如改变文件或目录的所有权、修改文件权限,或者执行需要较高权限...
综上所述,理解并熟练运用`not in`和`not exists`的不同特性,结合数据库的新功能和优化策略,是提升数据库性能的关键。同时,不断学习和掌握最新的数据库技术,如Oracle 11g中的新特性,也是数据库专业人员保持竞争...
本书《How not to Program in C++: 111 Broken Programs and 3 Working Ones, or Why Does 2+2=5986》由Steve Oualline撰写,通过介绍111个存在错误的程序和3个能够正常工作的程序,深入浅出地讲解了在C++编程中如何...
MySQL中的`NOT IN`, `LEFT JOIN`, `IS NULL`, 和 `NOT EXISTS` 是四种不同的SQL查询方式,它们在特定情况下可以实现相似的功能,但实际执行效率可能会有很大差异。本文主要探讨这四种方法在处理大数据量时的性能表现...
在实际应用中,选择`EXISTS`还是`IN`,以及是否使用`NOT EXISTS`代替`NOT IN`,应当基于对数据集大小、表结构、索引状况以及查询需求的深入理解。正确选择可以显著提升查询效率,避免不必要的资源消耗。
总之,“How Not To Program In C++”的主题旨在提醒我们注意编程中的陷阱,通过理解和避免这些问题,我们可以提升C++编程的水平,编写出更可靠、更高效的代码。通过学习和实践,每个程序员都能避免这些常见的错误,...
MySQL中的`NOT IN`子句常用于从...总之,理解并适当地运用`LEFT JOIN`可以有效地优化包含`NOT IN`的SQL查询,尤其是在处理大数据量时。通过这种方法,我们可以提高查询效率,减少数据库的负担,从而提升整体系统性能。
但是,在某些情况下,使用 sudo 命令时可能会出现 "username is not in the sudoers file" 的错误信息,这是因为当前用户没有被添加到 sudoers 文件中。 sudoers 文件是 Linux 系统中的一种配置文件,它定义了哪些...
书名《如何不当编程:C++篇》("How Not to Program in C++.pdf")暗示了本书将展示一些不正确的编程实践,这与大多数教科书的正面教学方法形成鲜明对比。它旨在通过揭示错误的编程方式来教育读者,从而避免重蹈覆辙...
总之,理解`NULL`值在SQL中的行为及其对`IN`和`NOT IN`子句的影响是非常重要的。在编写查询时,我们应该特别注意处理`NULL`值的情况,以确保查询结果的准确性。通过适当的方法,我们可以有效地解决`NULL`值带来的...
在SQL查询优化中,`IN`、`EXISTS`、`NOT IN`和`NOT EXISTS`是四个常见的比较和过滤条件,它们在不同场景下有不同的性能表现。以下是对这些操作符优化原则的详细说明: 1. **EXISTS的执行流程**: `EXISTS` 子查询...
上面两个简单的Sql,我们从表面理解,查询的最终结果应该是一样的,但实际结果却和我们想象的不一样 第一条sql查询的结果有一条数据 第二条sql查询的结果却为空 原因: not exists的子查询,对于子查询不返回行和...
在SQL查询中,`IN`、`EXISTS`、`NOT IN`以及`NOT EXISTS`是四个常用的比较和过滤操作符。它们在处理数据时有不同的效率和适用场景,特别是涉及到大数据量时,优化这些操作符的使用对于提升数据库查询性能至关重要。 ...
在给定的标题和描述中,涉及到的关键知识点是MySQL中的`NOT IN`操作符,它在查询时用于排除特定条件的结果。`NOT IN`是SQL查询语句的一个重要部分,帮助用户筛选出不满足指定条件的数据。 首先,我们要理解SQL的...
标题 "How Not to Program in C++" 提供了一个反向思维的角度来探讨C++编程,它可能涵盖了在使用C++时常见的错误、陷阱以及不良编程习惯。描述中的“怎样不用C++编程”虽然字面意思看似在说如何避免使用C++,但实际...