【发布时间】:2019-06-10 10:30:54
【问题描述】:
考虑 2 个需要返回所有列的查询:
查询 #1
select *
from TA
where id in (select id from TB where filterColumn = ?)
查询 #2
select *
from TA
where id in (?, ?, ? ... n)
TA 包含数百万条记录,TB 上的子查询返回 1-2000 条记录(但通常只有几百条)。
比如说,这些查询的结果将是 10k 条记录。
对于第一个查询,将对所有记录进行 1 次聚集索引扫描。
对于第 2 次 - 10k 键查找。此外,如果参数超过 2.1k - 将会有多个查询(极少数情况)。
就一般性能和同时插入/更新/删除语句而言,首选哪个查询?
【问题讨论】:
-
查询说明了什么?什么跑得更快?查询计划显示了什么?这也可能在DBA 上问得更好。
-
对于大量的ID,无论是在文字列表中还是从子查询返回,那么子查询版本可能会运行得更快,因为它可以通过索引进行调整。
-
如果您有两匹马并且您想知道这两匹马中哪一匹更快,那么赛马 - 请参阅 Eric 的 Which is faster? Lippert 了解更多背景
-
Larnu 运行时间或多或少相同,但 cpu 时间(有值查询低 10 倍)和解析时间(有值查询高 x 倍)存在差异。我在这里寻求的是更少的等待时间,因为在查找时锁定更少。 TimBiegeleisen 索引并没有真正的帮助,因为我需要结果中的所有列。在这种情况下,SQL 服务器将选择使用扫描而不是索引。
标签: sql-server