SQL-添加额外的列会使查询变慢

时间:2019-01-31 12:35:37

标签: sql-server tsql

我有以下(简化)查询。

在没有指定列的情况下运行时,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

1 个答案:

答案 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完全不同:

enter image description here

在第一个查询中,它仅对@A主键进行聚簇索引扫描,而在第二个查询中,它在表主键和嵌套循环上均具有聚簇索引扫描。

好像查询优化器足够聪明,可以理解何时不需要from子句中的表来获取结果,而只是完全忽略它。