0

我是 sql join 的初学者,并试图了解 sql server 中的各种类型的连接。我的查询与我刚刚使用 AdventureWorks2008 数据库在 sql server 2012 中输入的以下两段代码有关。然而,代码片段只需要很长时间(我现在已经让它执行了大约 45 分钟)而没有结果集。然而,代码片段 2 会在瞬间快速运行并输出结果集。我只是对问题所在感到困惑。

这是代码。

代码段一..(这需要很长时间执行而没有结果集)

select 
pro.ProductID
,pro.Name
,soh.OrderDate
,soh.SalesOrderID
from Sales.SalesOrderHeader soh
inner join Sales.SalesOrderDetail sod on sod.SalesOrderID = sod.SalesOrderID
inner join  Production.Product pro on pro.ProductID = sod.ProductID
order by soh.SalesOrderID

代码片段二(这个跑得很快)

`select soh.SalesOrderId
       ,soh.orderDate
       ,p.ProductId
       ,p.name
 from sales.SalesOrderHeader as soh
 inner join sales.SalesOrderDetail as sod on soh.SalesOrderID = sod.SalesOrderID
 inner join Production.Product as p on sod.ProductID = p.ProductID
 order by soh.SalesOrderId`

任何帮助/提示表示赞赏。我已经研究了 stackoverflow 之前的所有问题,但没有找到任何直接的答案,即字段的顺序是导致查询执行速度慢还是连接子句的顺序负责。我还读到查询计划优化器与哪个是查询执行的最佳计划有关,但是我未能在我的代码片段上下文中合理化。

4

1 回答 1

4

SalesOrderDetail您在第一个查询中的加入有问题。您正在为sod联接中的两个字段使用表别名。其中之一应该是soh。像这样错误的表别名会导致交叉连接,这将产生巨大的记录集。

于 2013-05-11T16:20:56.323 回答