我以前的SQL查询是否影响我当前的查询?
我有多个SQL查询,我一个接一个地运行这些查询以获取一组数据。在每个查询中,都有一组与其他查询完全相同的表。例如: 问题1我以前的SQL查询是否影响我当前的查询?,sql,sql-server,join,Sql,Sql Server,Join,我有多个SQL查询,我一个接一个地运行这些查询以获取一组数据。在每个查询中,都有一组与其他查询完全相同的表。例如: 问题1 SELECT * FROM Product1TableA A1 INNER JOIN Product1TableB B on A1.BId = B.Id INNER JOIN CommonTable1 C on C.Id = B.CId INNER JOIN CommonTable2 D on D.Id = B.DId ... 查询2 SELECT * FROM Prod
SELECT * FROM
Product1TableA A1
INNER JOIN Product1TableB B on A1.BId = B.Id
INNER JOIN CommonTable1 C on C.Id = B.CId
INNER JOIN CommonTable2 D on D.Id = B.DId
...
查询2SELECT * FROM Product2TableA A2
INNER JOIN Product2TableB B on A2.BId = B.Id
INNER JOIN CommonTable1 C on C.Id = B.CId
INNER JOIN CommonTable2 D on D.Id = B.DId
...
我正在尝试重新排序联接(每个查询联接大约20多个表),我在这里读到,它们不应该真正影响查询执行,除非SQL在优化过程中“放弃”,因为查询有多大
我想知道的是,在所有查询开始时聚集公共表联接是否真的有帮助…理论上,
from
子句中的联接的顺序对查询性能没有影响。对于少量的表,应该没有区别。优化器应该找到最佳执行路径
对于更多的表,优化器可能必须缩短其关于join
顺序的搜索。然后它将使用启发式——这些可能会受到join
顺序的影响
早期的查询对特定的执行计划没有影响
如果您在性能方面遇到问题,我猜join
order不是根本原因。SQL Server中最常见的问题是不适当的嵌套循环联接——这些问题可以通过优化器提示来处理。理论上,from
子句中的联接的顺序对查询性能没有影响。对于少量的表,应该没有区别。优化器应该找到最佳执行路径
对于更多的表,优化器可能必须缩短其关于join
顺序的搜索。然后它将使用启发式——这些可能会受到join
顺序的影响
早期的查询对特定的执行计划没有影响
如果您在性能方面遇到问题,我猜join
order不是根本原因。我在SQL Server中遇到的最常见的问题是不适当的嵌套循环联接——这些问题可以通过优化器提示来处理。Gordon的回答是一个很好的解释,但解释了联接的行为,还指定SQL Server的版本是相关的:
虽然连接顺序在优化中发生了更改,但优化程序
不尝试所有可能的联接顺序。当它找到它想要的东西时,它停止
将可行的解决方案视为优化行为
宝贵的资源
当优化器尽最大努力为联接选择一个好的顺序时,拥有多个联接将有更大的机会获得一个不太好的计划
就我个人而言,我在ERP的一些视图中看到了许多连接,它们通常运行正常。然而,有时(根据客户机的数据量、实例配置等),从这些视图中选择的一些内容花费的时间远远超过预期
如果此数据到达实际应用程序(.NET、JAVA等),一种方法是缓存所有小表中的信息,将其存储为字典(散列),并基于键执行O(1)查找
这提供了减少联接计数和不从数据库中读取这些表(缓存数据时除外)的优点。但是,这增加了应用程序的复杂性(缓存管理)
另一种解决方案是使用临时表并在多个查询中填充它们,以避免每个查询都有多个联接。此解决方案通常执行得更好,还提高了可调试性(如果查询没有提供正确的数据或根本没有数据,那么10-15个连接中的哪一个是问题?)
因此,我对您的问题的回答是:重新排序联接子句可能会给您带来一些好处,但我建议首先避免大量联接。Gordon的回答是一个很好的解释,但解释了联接的行为,还指定SQL Server的版本是相关的:
虽然连接顺序在优化中发生了更改,但优化程序
不尝试所有可能的联接顺序。当它找到它想要的东西时,它停止
将可行的解决方案视为优化行为
宝贵的资源
当优化器尽最大努力为联接选择一个好的顺序时,拥有多个联接将有更大的机会获得一个不太好的计划
就我个人而言,我在ERP的一些视图中看到了许多连接,它们通常运行正常。然而,有时(根据客户机的数据量、实例配置等),从这些视图中选择的一些内容花费的时间远远超过预期
如果此数据到达实际应用程序(.NET、JAVA等),一种方法是缓存所有小表中的信息,将其存储为字典(散列),并基于键执行O(1)查找
这提供了减少联接计数和不从数据库中读取这些表(缓存数据时除外)的优点。但是,这增加了应用程序的复杂性(缓存管理)
另一种解决方案是使用临时表并在多个查询中填充它们,以避免每个查询都有多个联接。此解决方案通常执行得更好,还提高了可调试性(如果查询没有提供正确的数据或根本没有数据,那么10-15个连接中的哪一个是问题?)
因此,我对你的问题的回答是:重新排列连接子句可能会给你带来一些好处,但我建议首先避免大量的连接。我想我理解了他想说/做什么:
我想知道的是,是否在一开始就聚集公共表联接
在我所有的疑问中,实际上有帮助的是
假设您有一些查询,并且每个查询都有3个以上的内部联接。这些查询是不同的,但总是有(例如)3个在相同字段上联接的公共表。现在的问题是:
会发生什么