Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我以前的SQL查询是否影响我当前的查询?_Sql_Sql Server_Join - Fatal编程技术网

我以前的SQL查询是否影响我当前的查询?

我以前的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

我有多个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 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个在相同字段上联接的公共表。现在的问题是: 会发生什么