子选择很快,几行,但外部选择很慢

时间:2013-12-13 19:08:57

标签: sql-server

我有以下内容,它立即返回5行:

SELECT CollID
FROM FabricView
WHERE MfgID = 30023
GROUP BY CollID

但是,当我执行以下操作时,需要9秒钟:

SELECT CollID,CollName
FROM Coll
WHERE CollID IN(
    SELECT CollID
    FROM FabricView
    WHERE MfgID = 30023
    GROUP BY CollID
)

我认为因为内部选择过快,只返回5行,所以外部选择也是瞬时的,但事实并非如此。

编辑:以这种方式重写会产生快速结果:

WITH CTE AS(
    SELECT CollID
    FROM FabricView
    WHERE MfgID = 30023
    GROUP BY CollID
)
SELECT Coll.CollID,CollName
FROM Coll
JOIN CTE 
ON Coll.CollID = CTE.CollID 

1 个答案:

答案 0 :(得分:1)

如果您已经使用上一个查询解决了(我认为是),请忽略此答案:

相反,您可以使用EXISTS语句代替od IN子句,这样:

SELECT CollID,CollName
FROM Coll
WHERE EXISTS
(
    SELECT 'FABRIC'
    FROM FabricView F
    WHERE F.MfgID = 30023
    AND F.CollID = Coll.CollID
)

通过这种方式,您不使用GROUP BY,在最新版本的Sql Server中,EXISTS比IN更有效(自2008年起)。