1

采取以下查询:

SELECT *
FROM FactALSAppSnapshot AS LB 
     LEFT OUTER JOIN MLALSInfoStage AS LA ON LB.ProcessDate = LA.ProcessDate AND 
                                                   LB.ALSAppID = LA.ALSNumber
     LEFT OUTER JOIN MLMonthlyIncomeStage AS LC ON LB.ProcessDate = LC.ProcessDate AND
                                                        LB.ALSAppID = LC.ALSNumber
     LEFT OUTER JOIN DimBranchCategory AS LI on LB.ALSAppBranchKey = LI.Branch
WHERE LB.ProcessDate=(SELECT TOP 1 LatestProcessDateKey
                      FROM DimDate)

请注意,WHERE条件是一个标量子查询。运行时会0:54产生367,853记录。

但是,如果我将WHERE子句切换为以下内容:

WHERE LB.ProcessDate=20161116

这以某种方式导致查询运行时跳转到57:33仍然产生367,853记录。幕后发生了什么会导致运行时的巨大飞跃?我本来希望子查询版本需要更长的时间,而不是文字整数值。

别名为LI(last join on the list) 的表似乎是唯一没有在其键上编制索引的表,并且如果我将该表作为连接删除并使用整数,似乎允许查询执行更接近第一个查询值而不是子查询。

SQL 服务器 11

4

1 回答 1

0

您问题的真正答案在于查询的执行计划。您可以在 SSMS 中查看实际计划。

没有计划,剩下的就是猜测。但是,根据我的经验,改变的是联接的处理方式。根据我的经验,当查询切换到嵌套循环连接时,查询速度会大大降低。这是优化器的心血来潮——当有一个常数时——认为这是运行查询的最佳方式。

我不确定为什么会这样。也许索引FactALSAppSnapshot(ProcessDate, ALSAppID, ALSAppBranchKey)会加快查询的两个版本。

于 2016-11-17T00:04:04.070 回答