我有这样的查询:
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更改查询?
答案 0 :(得分:1)
我认为原因很简单(而且我不确定评论中提到的文章是否解决了这个问题。)
SQL Server使用常量对in
列表进行顺序搜索。这意味着对于列表中不匹配的每个值,都需要比较所有值。其他一些数据库通过对列表进行排序并进行二分查找来优化这一点。
另一方面,带有子查询的in
可以使用索引 - 这实际上是二进制搜索。这可以显着减少计算量,特别是对于列表中没有的值。
答案 1 :(得分:1)
根据查询执行计划, IN(多个值)具有较高的“选择成本”, INNER JOIN 和 IN (选择.. )以相同的方式工作(使用索引扫描),选择成本较低。
感谢。