假设有人来找您,并说我们将通过用equals替换equals来减少我们编写的SQL数量IN。既可以用于单个标量值,也可以用于数字列表。
IN
SELECT * FROM table WHERE id = 1
或者
SELECT * FROM table WHERE id IN (1)
这些语句等于优化器产生的内容吗?
从表面上看,这看起来确实很简单,但是由于两个原因,它导致了简化:1.不需要复制大型SQL块;并且2.我们不会过度使用动态SQL。
这是一个人为的示例,但请考虑以下内容。
select a.* from tablea a join tableb b on a.id = b.id join tablec c on b.id2 = c.id2 left join tabled d on c.id3 = c.id3 where d.type = 1
…对于不止一种情况,同样如此
select a.* from tablea a join tableb b on a.id = b.id join tablec c on b.id2 = c.id2 left join tabled d on c.id3 = c.id3 where d.type in (1,2,3,4)
(这甚至不是一个很大的声明)
可以想象,您可以执行字符串连接,但是鉴于ORM的使用,这是不理想的,而且动态SQL字符串连接总是以良好的意愿开始的(至少在这些部分中如此)。
这两个会产生相同的执行计划-无论是table scan,index scan或index seek取决于是否/如何你有你的表建立索引。
table scan
index scan
index seek
您可以自己查看-显示图形执行计划(SQL Server Management Studio) -请参阅“使用执行计划选项”一节。