(删除了以前的帖子,可能是系统询问的方式不正确,我会再试一次)
-- 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
(数字)
答案 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