0

私はSQL結合の初心者で、SQLサーバーのさまざまなタイプの結合を理解しようとしています. 私のクエリは、AdventureWorks2008 データベースを使用して SQL Server 2012 で入力した次の 2 つのコードに関連しています。ただし、コード ピース 1 には非常に長い時間がかかります (現在、約 45 分間実行し続けています)。結果セットはありません。ただし、コード ピース 2 は非常に高速に実行され、結果セットを出力します。何が問題なのか混乱しています。

これがコードです。

コード ピース 1..(これは、結果セットなしで実行するのに非常に長い時間がかかります)

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

コード ピース 2 (これはすぐに実行されます)

`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結合の両方のフィールドにテーブル エイリアスを使用しています。それらの 1 つは である必要がありますsoh。このようにテーブルのエイリアスが間違っていると、クロス結合が発生し、膨大なレコードセットが生成されます。

于 2013-05-11T16:20:56.323 に答える