57

当我遇到这个查询时,我正在整理一些 sql:

SELECT 
        jm.IMEI ,
        jm.MaxSpeedKM ,
        jm.MaxAccel ,
        jm.MaxDeccel ,
        jm.JourneyMaxLeft ,
        jm.JourneyMaxRight ,
        jm.DistanceKM ,
        jm.IdleTimeSeconds ,
        jm.WebUserJourneyId ,
        jm.lifetime_odo_metres ,
        jm.[Descriptor]
FROM    dbo.Reporting_WebUsers AS wu WITH (NOLOCK)
        INNER JOIN dbo.Reporting_JourneyMaster90 AS jm WITH (NOLOCK) ON wu.WebUsersId = jm.WebUsersId
        INNER JOIN dbo.Reporting_Journeys AS j WITH (NOLOCK) ON jm.WebUserJourneyId = j.WebUserJourneyId
WHERE   ( wu.isActive = 1 )
        AND ( j.JourneyDuration > 2 )
        AND ( j.JourneyDuration < 1000 )
        AND ( j.JourneyDistance > 0 )

我的问题是,对于我会完成的上述查询,连接顺序是否会产生任何性能差异

FROM dbo.Reporting_JourneyMaster90 AS jm

然后将其他 2 个表加入到该表中

4

6 回答 6

55

SQL2008R2 服务器中的连接顺序无疑会影响查询性能,尤其是在存在大量表连接且 where 子句应用于多个表的查询中。

尽管在优化中连接顺序发生了变化,但优化器不会尝试所有可能的连接顺序。当它发现它认为可行的解决方案时,它就会停止,因为优化行为本身就使用了宝贵的资源。

我们已经看到性能像狗一样的查询(1 分钟 + 执行时间)仅通过更改连接表达式的顺序就可以降低到亚秒级的性能。但是请注意,这些是具有 12 到 20 个连接的查询以及几个表上的 where 子句。

诀窍是设置您的顺序以帮助查询优化器找出什么是有意义的。您可以使用强制命令,但这可能太死板了。尝试确保您的连接顺序从将通过 where 子句减少数据最多的表开始。

于 2014-01-09T12:52:26.957 回答
41

不,JOIN by order 在优化过程中发生了变化。

唯一需要注意的是选项FORCE ORDER,它将强制按照您指定的确切顺序进行连接。

于 2013-05-03T14:18:35.950 回答
12

我有一个明显的内部连接影响性能的例子。这是两个表之间的简单连接。一个有 50+ 百万条记录,另一个有 2,000 条。如果我从较小的表中选择并加入较大的表,则需要 5 分钟以上。

如果我从较大的表中选择并加入较小的表,则需要 2 分 30 秒。

这适用于 SQL Server 2012。

对我来说,这是反直觉的,因为我使用最大的数据集进行初始查询。

于 2014-11-15T16:48:46.247 回答
7

通常不会。我不是 100% 这将逐字应用于 Sql-Server,但在 Postgres 中,查询规划器保留重新排序内部连接的权利,因为它认为合适。例外情况是当您达到阈值时,调查更改订单的成本太高。

于 2013-05-03T14:14:31.207 回答
7

JOIN顺序无关紧要,查询引擎将根据索引和其他内容的统计信息重新组织它们的顺序。

对于测试,请执行以下操作:

  • 选择显示实际执行计划并运行第一个查询
  • 更改JOIN订单,现在再次运行查询
  • 比较执行计划

它们应该是相同的,因为查询引擎会根据其他因素重新组织它们。

正如其他 asnwer 所评论的那样,您可以使用OPTION (FORCE ORDER)您想要的顺序,但它可能不是最有效的顺序。

作为一般的经验法则,JOIN 顺序应该是最少记录的表在上面,大多数记录在最后,因为某些 DBMS 引擎的顺序可能会有所不同,以及如果使用 FORCE ORDER 命令来帮助限制结果.

于 2013-05-03T14:27:42.753 回答
-5

错误的。SQL Server 2005 这绝对很重要,因为您从 FROM 子句的开头限制数据集。如果您从 2000 条记录而不是 200 万条记录开始,它会使您的查询更快。

于 2013-10-31T16:02:41.370 回答