我是sql连接的初学者,并试图了解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以前的问题,但是没有找到任何直接的答案,关于字段的排序是负责慢查询执行还是join子句的排序是负责的。另外我已经读过查询计划优化器有哪些事情要做,哪个是查询执行的最佳计划,但是我在代码片段上下文中没有合理化。
答案 0 :(得分:4)
您在第一次查询中加入SalesOrderDetail
时遇到问题。您正在为联接中的两个字段使用sod
表别名。其中一个应该是soh
。让表别名错误会导致交叉连接,这将产生巨大的记录集。