为什么 In (选择) 的子查询比 in ('xx'、'xx'..)

  • 本文关键字:xx in 查询 In 选择 sql sql-server
  • 更新时间 :
  • 英文 :


我有这样的查询:

Select PATH
from FOLDER
where ...

此查询返回路径列表。(例如,600字符串)。

当我使用此路径列表时,请稍后使用

进行另一个请求
Select *
From FOLDER
WHERE FOLDER.PATH IN ('path1','path2' [...])

可能需要超过30秒的时间。

当我进行此查询时:

Select *
From FOLDER
WHERE
FOLDER.PATH IN (Select PATH
    from FOLDER
    where 
    ...)

花费不到1秒。

SQL Server是否执行查询并加入?

在这种情况下,为什么在这篇文章中他们建议使用加入更改查询?

我认为原因很简单(而且我不确定评论中提到的文章是否解决了这一点)。

SQL Server使用常数对in列表进行顺序搜索。这意味着,对于列表中不匹配的每个值,都需要比较所有值。其他一些数据库通过对列表进行排序并进行二进制搜索来优化此信息。

另一方面,带有子查询的in可以使用索引 - 本质上是二进制搜索。这可能是计算的显着降低,尤其是对于不在列表中的值。

根据查询执行计划, in(多重值具有高'选择成本'/strong>和在( select .. 以相同的方式工作(使用索引扫描),其选择低。

谢谢。

最新更新