我有以下(简化)查询。
在没有指定列的情况下运行时,Studio Manager会立即执行代码。当我添加1列时,它需要8秒钟的加载时间。 为简单起见,当我添加在此处已删除的其他列(计算得出)时,差异从瞬时增加到52秒。
我意识到,不了解整个表的结构就很难说出正在发生什么,但是任何人都可以想出为什么会这样的想法,或者如何尝试解决速度问题并使其更快地处理这个额外的列?
谢谢
SELECT DISTINCT TOP 50 tblHoraotTashlum.*,
Mossadname, mossadNumber, horaaStatusName, checkNumber
-- ADDING THIS FIELD IS THE ISSUE:
--, tblEvents.eventType
FROM [tblHoraotTashlum]
LEFT OUTER JOIN [tblEventCharges] ON tblHoraotTashlum.HoraaID = [tblEventCharges].[horaaID]
LEFT OUTER JOIN tblEvents ON tblEvents.eventID = tblEventCharges.EventID
LEFT OUTER JOIN tblMossadot ON tblHoraotTashlum.mossadID = tblMossadot.mossadID
LEFT OUTER JOIN tblHoraaStatus ON tblHoraotTashlum.StatusID = tblHoraaStatus.horaaStatusID
LEFT OUTER JOIN tblEventTypes ON tblEventTypes.typeID = tblEvents.eventType
WHERE ( tblMossadot.mossadID <> 114 )
ORDER BY tblHoraotTashlum.horaaid DESC
答案 0 :(得分:0)
如果eventType
是此查询中与tblEvents
实际相关的唯一列,则将其添加到select子句将更改执行计划(如果没有,它甚至可能不包含对tblEvents的任何操作)。选择速度问题可以通过正确的索引解决。
这是一个简单的演示:
DECLARE @A AS TABLE
(
AId int identity(1,1) primary key,
Achar char(1)
)
INSERT INTO @A (Achar) VALUES ('A'),('B'),('C'),('D'),('E'),('A'),('B'),('C'),('D'),('E');
DECLARE @B AS TABLE
(
BId int identity(1,1) primary key,
Bchar char(1)
)
INSERT INTO @B (Bchar) VALUES ('A'),('B'),('C'),('D'),('E'),('A'),('B'),('C'),('D'),('E'),('A'),('B'),('C'),('D'),('E');
SELECT DISTINCT TOP 7 A.*
FROM @A As A
LEFT OUTER JOIN @B As B
ON A.AId = B.BId
ORDER BY A.AId DESC
SELECT DISTINCT TOP 7 A.*, B.Bchar
FROM @A As A
LEFT OUTER JOIN @B As B
ON A.AId = B.BId
ORDER BY A.AId DESC
两个查询的注解the execution plan完全不同:
在第一个查询中,它仅对@A
主键进行聚簇索引扫描,而在第二个查询中,它在表主键和嵌套循环上均具有聚簇索引扫描。
好像查询优化器足够聪明,可以理解何时不需要from子句中的表来获取结果,而只是完全忽略它。