sgt*_*gtz 35 sql t-sql sql-server
假设有人来找你,并说我们将通过替换等于减少我们编写的SQL数量IN.单用标量值和数字列表都可以使用.
SELECT *
FROM table
WHERE id = 1
Run Code Online (Sandbox Code Playgroud)
要么
SELECT *
FROM table
WHERE id IN (1)
Run Code Online (Sandbox Code Playgroud)
这些语句是否等同于优化程序生成的语句?
从表面上看,这看起来非常简单,但由于两个原因导致简化: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
Run Code Online (Sandbox Code Playgroud)
......对于不止一个案例,也是如此
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)
Run Code Online (Sandbox Code Playgroud)
(这甚至不是一个大的声明)
可以想象你可以进行字符串连接,但考虑到ORM的使用,这是不可取的,并且动态SQL字符串连接总是以良好的意图开始(至少在这些部分中).
Jer*_*ins 28
这两个会产生相同的执行计划-无论是table scan,index scan或index seek取决于是否/如何你有你的表建立索引.
您可以自己查看 - 显示图形执行计划(SQL Server Management Studio) - 请参阅"使用执行计划选项"一节.
Aar*_*and 19
这两个特定的语句等同于优化器(你比较了执行计划吗?),但我认为你从后者中获得的更重要的好处是
WHERE id = 1 OR id = 2 OR id = 3 OR id = 4 OR id = 5
Run Code Online (Sandbox Code Playgroud)
可以表示如下,更简洁和可读(但在语义上等同于优化器)版本:
WHERE id IN (1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)
问题是,当表达为后者时,大多数人认为他们可以传递字符串,@list = '1,2,3,4,5'然后说:
WHERE id IN (@list)
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为@list它是单个标量字符串,而不是整数数组.
对于您有单一值的情况,我不知道"优化"如何帮助任何事情.你没有写过更少的SQL,你实际上写的更多.您能否更详细地概述这将如何导致更少的SQL?
| 归档时间: |
|
| 查看次数: |
21723 次 |
| 最近记录: |