T-SQL SELECT *快速,SELECT TOP 50缓慢

时间:2019-07-03 10:06:15

标签: sql-server tsql

(删除了以前的帖子,可能是系统询问的方式不正确,我会再试一次)

    -- 300Ms
    SELECT AppId FROM Application ap
    LEFT OUTER JOIN MissingThings mt on mt.AppId = ap.AppId
    WHERE mt.AppId is NULL
    ORDER BY mt.Id

-- 1.5s
SELECT TOP 50 FROM (TheSame)

    -- 100Ms
    SELECT TOP 50 AppId FROM Application ap
    LEFT OUTER JOIN MissingThings mt on mt.AppId = ap.AppId
    --WHERE mt.AppId is NULL
    ORDER BY mt.Id 

如果我对原始查询应用TOP,则会变慢。如果没有TOP,它将快速返回所有1000条记录。

如果我删除WHERE子句并获得TOP 50,它又很快了。

还尝试了其他帖子建议将WHERE替换为NOT EXISTS的尝试。没有帮助。

是否存在任何可能的一般原因,或者确实是我的数据库所特有的? 我想如果是具体的话,我就不能在这里获得帮助,因为不允许我共享执行计划。

编辑:

WHERE子句中还有其他两个条件,我认为这是可以忽略的,但是一旦我注释了这些条件,原始查询将在50毫秒内返回!!!!!!

SELECT TOP 50 AppId FROM Application ap
        LEFT OUTER JOIN MissingThings mt on mt.AppId = ap.AppId
        WHERE mt.AppId is NULL
AND ap.IsOrderFinished = 1
AND ap.IsAssigned = 2
        ORDER BY mt.Id 

在IsOrderFinished和IsAssigned上添加了非聚集索引-索引或其中之一都没有帮助。

更多结果:

降序快速(50ms!) ORDER BY mt.Id DESC(数字)

1 个答案:

答案 0 :(得分:1)

有时候,我无法最佳地完成一个完整的查询,但是我可以使其最佳化。然后,我没有继续尝试优化完整查询,而只是将零件移至临时表并使用它们来构建完整查询。

这应该在300ms内执行,而不是1.5s

SELECT AppId 
into #Application
FROM Application ap
     LEFT OUTER JOIN MissingThings mt on mt.AppId = ap.AppId
WHERE mt.AppId is NULL
ORDER BY ap.AppId 

SELECT TOP 50 * FROM #Application

DROP TABLE #Application

我们也会使用您最快的查询来尝试加快速度。这应该在接近100毫秒的时间内执行。

CREATE TABLE #Application (AppId INT, MissingAppId INT)
CREATE CLUSTERED INDEX #IX_Application ON #Application (MissingAppId, AppId)

INSERT INTO #Application (AppId, MissingAppId)
SELECT ap.AppId, mt.AppId
FROM Application ap
     LEFT OUTER JOIN MissingThings mt on mt.AppId = ap.AppId

SELECT TOP 50 * 
FROM #Application
WHERE MissingAppId IS NULL
ORDER BY AppId

DROP TABLE #Application