`
marb
  • 浏览: 422456 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

优化SQL 语句 in 和not in 的替代方案

 
阅读更多

优化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执行时间要短很多了

分享到:
评论

相关推荐

    SQLServer 优化SQL语句 in 和not in的替代方案

    本文将深入探讨`IN`和`NOT IN`的替代方案,并通过实际示例展示其性能差异。 首先,`IN`操作符在SQL语句中用于指定一个值列表,当查询的目标字段的值在列表内时返回结果。然而,这种操作符可能导致SQL Server尝试将...

    sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句

    SQL语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句 SQL语句优化是数据库性能优化的重要方面之一。在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下,使用EXISTS...

    sql语句的优化

    ### SQL语句优化详解 #### 一、引言 在数据库设计与管理中,SQL语句的优化是一项至关重要的工作。合理的SQL优化不仅能显著提升数据处理速度,还能有效降低服务器资源消耗,从而提高整个系统的响应时间和用户体验。...

    最新整理的常用sql语句及优化大全

    本资源“最新整理的常用sql语句及优化大全”涵盖了SQL的基础使用和性能优化,对于数据库管理员、开发人员或是学习者来说,都是极具价值的学习资料。 一、SQL常用语句 1. **数据查询**:`SELECT`语句是SQL中最基本...

    非常好用的SQL语句优化34条+sql语句基础

    在SQL编程领域,掌握高效的SQL语句优化技巧和基础知识是至关重要的。以下是对"非常好用的SQL语句优化34条+sql语句基础"这一主题的详细解析: 1. **索引优化**:索引是提高查询速度的关键。创建合适的索引(主键、...

    Oracle——sql语句优化

    ### Oracle SQL语句优化策略详解 #### 操作符优化概览 在Oracle数据库环境中,SQL语句的优化是提升...在实际操作中,开发者和DBA应持续关注查询性能,不断调整和优化SQL语句,以适应不断变化的数据需求和技术环境。

    JAVA-SQL语句优化.doc

    此外,外部联接操作符`+`的使用也是一种优化策略,它可以替代效率低下的`NOT IN`操作。例如,通过将`NOT IN`查询转换为左联接查询,可以显著提高查询速度,尤其是在处理大型数据时。 最后,注意在复杂的查询中,...

    Sql语句优化(很好的资料)

    SQL语句优化是提高软件系统效率的关键技术,尤其是在大数据量的场景下,高效的SQL能够显著提升数据库查询速度,降低系统资源消耗。以下是一些关于SQL优化的重要知识点: 1. **IN操作符**: - 使用IN操作符虽然使得...

    一般SQL语句优化整理

    - 如果确实需要使用不等于运算符,考虑使用`NOT IN`、`NOT EXISTS`等替代方案。 ### 5. 使用INNER JOIN代替IN子句 - **场景**:在连接两个表时,使用`IN`子句可能会导致性能下降。 - **优化建议**: - 考虑使用`...

    sql语句优化技术分析

    SQL语句优化是数据库管理中的核心技能之一,它关乎到系统的性能、响应时间和资源利用率。在处理大量数据时,有效的SQL优化策略能显著提升数据库应用的效率。以下是对SQL语句优化技术的详细分析: 一、理解执行计划 ...

    sql语句的一些优化

    SQL语句优化是数据库管理中的重要环节,它可以显著提升数据库的性能和响应速度。下面将详细探讨几个关键的SQL优化策略: 1. **书写规范**:尽管大部分数据库系统(如Oracle)在执行时不区分大小写,但在编写SQL时,...

    SQL语句优化技术分析

    标题和描述均提到了“SQL语句优化技术分析”,这一主题是数据库管理和性能提升的关键领域。在数据库系统中,SQL(Structured Query Language)是用于管理关系数据库的标准语言,其优化对于提高查询效率、减少资源...

    Oracle SQL语句优化技术分析

    - **优点**:使用`IN`操作符编写的SQL语句易于理解和编写,符合现代软件开发风格。 - **缺点**:相较于其他操作符,`IN`操作符可能导致较低的性能,尤其是在处理大量数据时。 **Oracle执行逻辑** - Oracle尝试将`IN...

    sql语句优化大全.docx

    SQL 语句优化大全 SQL 语句优化是程序员必须掌握的一项技能,也是企业经常问到的问题之一。对 MySQL 语句进行优化可以提高查询效率,减少数据库负载。下面是 SQL 语句优化的十个要点: 1. 使用 EXPLAIN 查看 SQL ...

    SQL Server中的SQL语句优化与效率问题

    在SQL Server中,SQL语句的优化和效率是数据库管理员和开发人员必须关注的重要话题。SQL Server具有一个称为“查询优化器”的组件,它负责分析SQL语句并选择最佳的执行计划,以确保数据检索的高效性。然而,了解查询...

    经典SQL查询总结关于Exists,not Exists.in ,not in效率的说明。

    - 在某些情况下,可以考虑使用 `EXISTS` 或 `NOT EXISTS` 来替代 `IN` 和 `NOT IN`,以提高查询效率。 #### 三、左连接、右连接与全连接 除了上述几种查询方式之外,SQL 还提供了不同的连接类型来处理不同情况下...

    关于SQL语句的优化

    SQL语句优化是数据库管理中的关键环节,其目的是提高查询效率,减少资源消耗,提升系统性能。本文主要讨论四个方面的SQL优化策略:操作符优化、SQL书写的影响、SQL语句索引的利用以及其他的优化技巧。 一、操作符...

Global site tag (gtag.js) - Google Analytics