为什么带有项目列表的IN语句比带有子查询的IN语句更快?

时间:2011-09-12 08:58:02

标签: sql sql-server

我遇到以下情况:

我有一个非常复杂的视图,我可以从中选择几个记录。

SELECT * FROM VW_Test INNER JOIN TBL_Test ON VW_Test.id = TBL_Test.id 
WHERE VW_Test.id IN (1000,1001,1002,1003,1004,[etc])

这实际上立即返回一个结果(当前在该IN语句中有25个项目)。但是,当我使用以下查询时,它的速度会非常快。

SELECT * FROM VW_Test INNER JOIN TBL_Test ON VW_Test.id = TBL_Test.id 
WHERE VW_Test.id IN (SELECT id FROM TBL_Test)

TBL_Test中有25条记录,此查询大约需要5秒钟。我在TBL_Test中有一个关于该id的索引。

任何人都知道为什么会发生这种情况以及如何提升表现?

编辑:我忘了提到这个子查询

SELECT id FROM TBL_Test

也会立即返回结果。

1 个答案:

答案 0 :(得分:1)

好吧,当使用子查询时,数据库引擎首先必须生成子查询的结果,然后才能执行任何其他操作,这需要时间。如果您有预定义的列表,则不需要这样做,引擎可以“按原样”使用这些值。至少,这就是我理解的方式。

如何提高性能:取消子查询。在这种情况下,我认为你甚至不需要IN子句。 INNER JOIN就足够了。