我遇到以下情况:
我有一个非常复杂的视图,我可以从中选择几个记录。
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
也会立即返回结果。
答案 0 :(得分:1)
好吧,当使用子查询时,数据库引擎首先必须生成子查询的结果,然后才能执行任何其他操作,这需要时间。如果您有预定义的列表,则不需要这样做,引擎可以“按原样”使用这些值。至少,这就是我理解的方式。
如何提高性能:取消子查询。在这种情况下,我认为你甚至不需要IN子句。 INNER JOIN就足够了。