【问题标题】:SQL Server IN vs = in query(for one value)SQL Server IN vs = in 查询(一个值)
【发布时间】:2015-03-21 12:09:44
【问题描述】:

首先,抱歉主题名称含糊(我想不出更好的)。

一个 SO 答案让我开始思考,当我将= 用于 IN 时,是否真的会对性能产生任何影响。

select 1 id, 'abc' name into #a union 
select 2, 'abcd' union 
select 3, 'abcde' 

select * from #a where id = 1 ------ Query 1
select * from #a where id in (1)------ Query 2

我检查了这两个查询的查询计划,并发现它们对我来说是相同的(也许这个示例过于简单,可能这就是原因)。

但是我在使用IN 时是否违反了任何性能最佳实践?当然,这其中肯定会有一些开销,因为IN 可以处理多个项目,甚至SELECTS。我知道IN 在功能方面提供了更多功能,但对于id = 1 有多个记录的情况,

select * from #a where id = (SELECT id from #a where id = 1)------ Query 3
select * from #a where id in (SELECT id from #a where id = 1)------ Query 4

query3 会失败,而 query4 会工作。因此,我希望将来在我的代码中用IN 替换=。但我想知道任何潜在权衡。

编辑 我只是想了解 SQL 引擎如何(以不同的方式?)处理这些语句。

【问题讨论】:

  • 通常你会用一个连接重写查询 3 和 4,所以你不需要 IN 或 =。
  • 只是一个例子:)
  • "=" 运算符会比“IN”快。如果你想检查使用 SET STATISTIC TIME IO ON
  • 为什么是我想知道的。

标签: sql-server optimization in-clause


【解决方案1】:

如果可以的话,请忽略您问题的性能方面,这里存在设计问题。您应该按照自己的意图编写代码,这样当其他人阅读您的代码时,他们就有更好的机会理解您想要实现的目标。您期望 SELECT id from #a where id = 1 只返回一条记录吗?如果是这样,那么使用'='。如果您希望它返回零或更多,那么 '=' 将是错误的。

【讨论】:

  • 同意。实际上,我出于好奇而问过这个问题,即较低级别的 SQL 引擎是否实际上以不同的方式对待 IN=。我必须重申的问题纯粹是为了了解引擎的工作原理。
  • 这方面的性能要复杂得多。 '=' 运算符是 '=' 运算符,很好且可预测,但 'IN' 可以根据许多不同的因素以多种不同的方式在查询计划中表现出来。
【解决方案2】:

据我所知,索引效率是“=”和“in”之间的唯一考虑因素。因此,如果您想利用索引,则需要使用“=”。

“in”语句是不可分割的。 "=" 是 sargable。

查询 3 和 4 可能会在子查询中进行额外的表扫描,因此与连接相比,您会降低效率。

【讨论】:

  • 我不同意。我在 id 列上创建了聚集索引并进行了测试,发现这两个查询都使用了Index Seek 操作。所以是的,对于查询 4 ​​也使用了索引
  • "in" 和 "=" 是操作符,说操作符是 sargable 或 not-sargable 是不正确的。表达式是否可搜索,取决于许多因素。
【解决方案3】:

一般IN 将被分解成多个= 谓词,这些谓词将用于满足查询。当在您的示例中的索引(假设)上使用时,各个谓词将用于索引查找操作。自己试试。查看执行计划的“索引搜索”操作中的搜索谓词。

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 2016-10-11
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 2012-02-03
    • 2014-05-05
    相关资源
    最近更新 更多