当我遇到这个问题时,我只是整理了一些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个表加入到那个
中答案 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个记录,那么它会使你的查询更快。