为什么子查询的性能优于具有多个连接的WHERE子句中的litteral值?

时间:2016-11-16 23:31:49

标签: sql sql-server join scalar-subquery

参加以下查询:

function RouteController($scope, $routeParams) {
        $scope.templateUrl = '/sso/salesforce/' + $routeParams.companyId + '.html';
    }

请注意,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(列表中的最后一个连接)似乎是唯一没有对其键进行索引的表,并且似乎允许查询执行更接近第一个查询我将该表删除为连接并使用整数值而不是子查询。

SQL Server 11

1 个答案:

答案 0 :(得分:0)

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

没有这个计划,剩下的就是猜测。但是,根据我的经验,联接的处理方式有哪些变化。根据我的经验,当查询切换到嵌套循环连接时,查询会显着减慢。这是优化器的突发奇想,当有一个常量时 - 认为这是运行查询的最佳方式。

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