2

すべての注文の詳細を選択するための LINQ を次に示します。product テーブルとの結合を作成して、製品名を取得します。

var query = from od in db.Order_Details
            join p in db.Products on od.ProductID equals p.ProductID
            select new { od.OrderID, od.ProductID, p.ProductName };

Join が存在することを知らなかった場合の方法は次のとおりです。

var query = from od in db.Order_Details
            select new { od.OrderID, 
                         od.ProductID, 
                         ProductName = (from p in db.Products 
                                        where p.ProductID == od.ProductID 
                                        select p.ProductName).First()
            };

それらは異なる基になる SQL コードを生成します。最初の方法は 2 番目の方法よりも高速ですか? もしそうなら、その理由は?

到着予定時刻:

結合クエリの db.Log:

SELECT [t0].[OrderID], [t0].[ProductID], [t1].[ProductName]
FROM [dbo].[Order Details] AS [t0]
INNER JOIN [dbo].[Products] AS [t1] ON [t0].[ProductID] = [t1].[ProductID]

2 番目のクエリの db.Log:

SELECT [t0].[OrderID], [t0].[ProductID], (
    SELECT TOP (1) [t1].[ProductName]
    FROM [dbo].[Products] AS [t1]
    WHERE [t1].[ProductID] = [t0].[ProductID]
    ) AS [ProductName]
FROM [dbo].[Order Details] AS [t0]
4

2 に答える 2

3

DBMS は結合の最適化に非常に優れているため、通常、結合は同等のネストされた選択よりも高速ですが、優れた SQL コンパイラは結合を同じ SQL に最適化する可能性があります。目的をより明確にするものを使用する必要があります。この場合はおそらく結合です。

于 2012-06-27T18:48:12.743 に答える
1

結合なしで提供する2番目の例は、「相関サブクエリ」と呼ばれるものを実行し、通常、結合よりも遅くなります。結果は同じですが、違いはそれらの結果を取得するパフォーマンスです。あなたは参加を支持するべきです。

http://msdn.microsoft.com/en-us/library/ms187638%28v=sql.105%29.aspx

于 2012-06-27T18:55:04.953 に答える