Sql JOIN命令会影响性能吗?

时间:2013-05-03 14:07:03

标签: sql sql-server

当我遇到这个问题时,我只是整理了一些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个表加入到那个

6 个答案:

答案 0 :(得分:38)

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

虽然优化时更改了连接顺序,但优化程序不会尝试所有可能的连接顺序。当它找到它认为可行的解决方案时它会停止,因为优化行为会使用宝贵的资源。

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

诀窍是设置您的订单以帮助查询优化器找出有意义的东西。您可以使用强制订单,但这可能过于严格。尝试确保您的连接顺序从表中开始,这些表将通过where子句最大程度地减少数据。

答案 1 :(得分:28)

不,在优化过程中按顺序更改JOIN。

唯一需要注意的是Option FORCE ORDER,它会按照你指定的确切顺序强制连接发生。

答案 2 :(得分:8)

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

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

这适用于SQL Server 2012。

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

答案 3 :(得分:6)

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

测试时请执行以下操作:

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

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

如同其他asnwer所评论的那样,您可以使用OPTION (FORCE ORDER)来完全按照您想要的顺序使用,但也许它不是最有效的订单。

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

答案 4 :(得分:4)

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

答案 5 :(得分:-4)

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