为什么In(select)的子查询比('xx','xx'..)更快

时间:2017-11-29 14:32:46

标签: 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是否执行查询并进行加入?

在这种情况下,为什么在this post他们建议用JOIN更改查询?

2 个答案:

答案 0 :(得分:1)

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

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

另一方面,带有子查询的in可以使用索引 - 这实际上是二进制搜索。这可以显着减少计算量,特别是对于列表中没有的值。

答案 1 :(得分:1)

根据查询执行计划, IN(多个值具有较高的“选择成本”, INNER JOIN IN (选择.. 以相同的方式工作(使用索引扫描),选择成本较低。

感谢。