一尘不染

等于vs的sql语句

sql

假设有人来找您,并说我们将通过用equals替换equals来减少我们编写的SQL数量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字符串连接总是以良好的意愿开始的(至少在这些部分中如此)。


阅读 166

收藏
2021-03-10

共1个答案

一尘不染

这两个会产生相同的执行计划-无论是table scanindex scanindex seek取决于是否/如何你有你的表建立索引。

您可以自己查看-显示图形执行计划(SQL Server Management Studio) -请参阅“使用执行计划选项”一节。

2021-03-10