优化SQL 语句 in 和not in 的替代方案
用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。
但是用IN的SQL性能总是比较低的,从SQL执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:
SQL试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 推荐在业务密集的SQL当中尽量不采用IN操作符
NOT IN 此操作是强列推荐不使用的,因为它不能应用表的索引。推荐用NOT EXISTS 或(外连接+判断为空)方案代替
在数据库中有两个表,一个是当前表Info(id,PName,remark,impdate,upstate),一个是备份数据表bakInfo(id,PName,remark,impdate,upstate),将当前表数据备份到备份表去,就涉及到not in 和in 操作了:
首先,添加10万条测试数据
代码
使用not in 和in操作:
1
2
3
4
5
6
7
8
|
SET STATISTICS TIME ON
GO --备份数据 insert into bakInfo(id,PName,remark,impdate,upstate)
select id,PName,remark,impdate,upstate from dbo.Info
where id not in ( select id from dbo.bakInfo)
GO SET STATISTICS TIME OFF
|
此操作执行时间:
1
2
3
4
5
6
7
8
9
|
SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,占用时间 = 3 毫秒。 SQL Server 执行时间: CPU 时间 = 453 毫秒,占用时间 = 43045 毫秒。 (100000 行受影响) SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。 --更改当前表状态 update Info set upstate=1 where id in ( select id from dbo.bakInfo)
|
此操作执行时间:
1
2
3
4
5
6
7
8
9
|
SQL Server 分析和编译时间: CPU 时间 = 62 毫秒,占用时间 = 79 毫秒。 SQL Server 执行时间: CPU 时间 = 188 毫秒,占用时间 = 318 毫秒。 (100000 行受影响) SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。 --删除当前表数据 delete from Info where upstate=1 and id in ( select id from dbo.bakInfo)
|
此操作执行时间:
1
2
3
4
5
6
7
|
SQL Server 分析和编译时间: CPU 时间 = 183 毫秒,占用时间 = 183 毫秒。 SQL Server 执行时间: CPU 时间 = 187 毫秒,占用时间 = 1506 毫秒。 (100000 行受影响) SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。 |
使用join连接替代方案:
1
2
3
4
5
6
7
8
9
10
11
|
SET STATISTICS TIME ON
GO --备份数据 insert into bakInfo(id,PName,remark,impdate,upstate)
select id,PName,remark,impdate,upstate from
( SELECT Info.id,Info.PName, Info.remark, Info.impdate,Info.upstate, bakInfo.id AS bakID
FROM Info left JOIN
bakInfo ON Info.id = bakInfo.id ) as t
where t.bakID is null and t.upstate=0
GO SET STATISTICS TIME OFF ;
|
此操作执行时间:
1
2
3
4
5
6
7
|
SQL Server 分析和编译时间: CPU 时间 = 247 毫秒,占用时间 = 247 毫秒。 SQL Server 执行时间: CPU 时间 = 406 毫秒,占用时间 = 475 毫秒。 (100000 行受影响) SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。 |
1
2
3
4
|
--更改当前表状态 update Info set upstate=1
FROM Info INNER JOIN
bakInfo ON Info.id = bakInfo.id
|
此操作执行时间:
1
2
3
4
5
6
7
|
SQL Server 分析和编译时间: CPU 时间 = 4 毫秒,占用时间 = 4 毫秒。 SQL Server 执行时间: CPU 时间 = 219 毫秒,占用时间 = 259 毫秒。 (100000 行受影响) SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。 |
1
2
3
4
5
|
--删除当前表数据 delete from Info
FROM Info INNER JOIN
bakInfo ON Info.id = bakInfo.id
where Info.upstate=1
|
此操作执行时间:
1
2
3
4
5
6
7
|
SQL Server 分析和编译时间: CPU 时间 = 177 毫秒,占用时间 = 177 毫秒。 SQL Server 执行时间: CPU 时间 = 219 毫秒,占用时间 = 550 毫秒。 (100000 行受影响) SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。 |
可以看出使用join方案比使用not in 和in执行时间要短很多了
相关推荐
本文将深入探讨`IN`和`NOT IN`的替代方案,并通过实际示例展示其性能差异。 首先,`IN`操作符在SQL语句中用于指定一个值列表,当查询的目标字段的值在列表内时返回结果。然而,这种操作符可能导致SQL Server尝试将...
SQL语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句 SQL语句优化是数据库性能优化的重要方面之一。在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下,使用EXISTS...
### SQL语句优化详解 #### 一、引言 在数据库设计与管理中,SQL语句的优化是一项至关重要的工作。合理的SQL优化不仅能显著提升数据处理速度,还能有效降低服务器资源消耗,从而提高整个系统的响应时间和用户体验。...
本资源“最新整理的常用sql语句及优化大全”涵盖了SQL的基础使用和性能优化,对于数据库管理员、开发人员或是学习者来说,都是极具价值的学习资料。 一、SQL常用语句 1. **数据查询**:`SELECT`语句是SQL中最基本...
在SQL编程领域,掌握高效的SQL语句优化技巧和基础知识是至关重要的。以下是对"非常好用的SQL语句优化34条+sql语句基础"这一主题的详细解析: 1. **索引优化**:索引是提高查询速度的关键。创建合适的索引(主键、...
### Oracle SQL语句优化策略详解 #### 操作符优化概览 在Oracle数据库环境中,SQL语句的优化是提升...在实际操作中,开发者和DBA应持续关注查询性能,不断调整和优化SQL语句,以适应不断变化的数据需求和技术环境。
此外,外部联接操作符`+`的使用也是一种优化策略,它可以替代效率低下的`NOT IN`操作。例如,通过将`NOT IN`查询转换为左联接查询,可以显著提高查询速度,尤其是在处理大型数据时。 最后,注意在复杂的查询中,...
SQL语句优化是提高软件系统效率的关键技术,尤其是在大数据量的场景下,高效的SQL能够显著提升数据库查询速度,降低系统资源消耗。以下是一些关于SQL优化的重要知识点: 1. **IN操作符**: - 使用IN操作符虽然使得...
- 如果确实需要使用不等于运算符,考虑使用`NOT IN`、`NOT EXISTS`等替代方案。 ### 5. 使用INNER JOIN代替IN子句 - **场景**:在连接两个表时,使用`IN`子句可能会导致性能下降。 - **优化建议**: - 考虑使用`...
SQL语句优化是数据库管理中的核心技能之一,它关乎到系统的性能、响应时间和资源利用率。在处理大量数据时,有效的SQL优化策略能显著提升数据库应用的效率。以下是对SQL语句优化技术的详细分析: 一、理解执行计划 ...
SQL语句优化是数据库管理中的重要环节,它可以显著提升数据库的性能和响应速度。下面将详细探讨几个关键的SQL优化策略: 1. **书写规范**:尽管大部分数据库系统(如Oracle)在执行时不区分大小写,但在编写SQL时,...
标题和描述均提到了“SQL语句优化技术分析”,这一主题是数据库管理和性能提升的关键领域。在数据库系统中,SQL(Structured Query Language)是用于管理关系数据库的标准语言,其优化对于提高查询效率、减少资源...
- **优点**:使用`IN`操作符编写的SQL语句易于理解和编写,符合现代软件开发风格。 - **缺点**:相较于其他操作符,`IN`操作符可能导致较低的性能,尤其是在处理大量数据时。 **Oracle执行逻辑** - Oracle尝试将`IN...
SQL 语句优化大全 SQL 语句优化是程序员必须掌握的一项技能,也是企业经常问到的问题之一。对 MySQL 语句进行优化可以提高查询效率,减少数据库负载。下面是 SQL 语句优化的十个要点: 1. 使用 EXPLAIN 查看 SQL ...
在SQL Server中,SQL语句的优化和效率是数据库管理员和开发人员必须关注的重要话题。SQL Server具有一个称为“查询优化器”的组件,它负责分析SQL语句并选择最佳的执行计划,以确保数据检索的高效性。然而,了解查询...
- 在某些情况下,可以考虑使用 `EXISTS` 或 `NOT EXISTS` 来替代 `IN` 和 `NOT IN`,以提高查询效率。 #### 三、左连接、右连接与全连接 除了上述几种查询方式之外,SQL 还提供了不同的连接类型来处理不同情况下...
SQL语句优化是数据库管理中的关键环节,其目的是提高查询效率,减少资源消耗,提升系统性能。本文主要讨论四个方面的SQL优化策略:操作符优化、SQL书写的影响、SQL语句索引的利用以及其他的优化技巧。 一、操作符...