2012-03-09 13 views
0

私はしばらくの間、私の頭を叩いていました。私はこれを達成したい:Linq2SQLのグループ化と合計の最適化

SELECT [t2].[nArtKey], [t2].[value] AS [nQty] 
FROM (
    SELECT SUM([t0].[nQty]) AS [value], [t1].[nArtKey] 
     FROM [vdatStockTransactions] AS [t0] 
     INNER JOIN [regArtSKU] AS [t1] ON [t0].[nSKU] = [t1].[nSKU] 
     GROUP BY [t1].[nArtKey] 
     ) AS [t2] 
    INNER JOIN [regArticles] AS [t3] ON [t2].[nArtKey] = [t3].[nArtKey] 
    INNER JOIN [regGroupConnector] AS [t4] ON [t2].[nArtKey] = [t4].[nArtKey] 
WHERE [t2].[value] > @p0 

私はLINQの量のためにexept、私が欲しい、まさにほとんどを与え、これまでに持って何...

from trans in context.vdatStockTransactions 
join sku in context.regArtSKUs on trans.nSKU equals sku.nSKU 
group trans by new { sku.nArtKey } into grp 
where grp.Sum(g => g.nQty) > 0 
join art in context.regArticles on grp.Key.nArtKey equals art.nArtKey  
join ca in context.regGroupConnectors on grp.Key.nArtKey equals ca.nArtKey 
select new 
{ 
    nArtKey = grp.Key.nArtKey, 
    //nQty = grp.Sum(g => g.nQty) 
}; 

しかし、私はnQty私のコメントを解除した場合これを得る:

SELECT [t7].[nArtKey], [t7].[value] AS [nQty] 
FROM (
    SELECT [t3].[nArtKey], (
     SELECT SUM([t5].[nQty]) 
     FROM [vdatStockTransactions] AS [t5] 
     INNER JOIN [regArtSKU] AS [t6] ON [t5].[nSKU] = [t6].[nSKU] 
     WHERE [t2].[nArtKey] = [t6].[nArtKey] 
     ) AS [value], [t2].[value] AS [value2] 
    FROM (
     SELECT SUM([t0].[nQty]) AS [value], [t1].[nArtKey] 
     FROM [vdatStockTransactions] AS [t0] 
     INNER JOIN [regArtSKU] AS [t1] ON [t0].[nSKU] = [t1].[nSKU] 
     GROUP BY [t1].[nArtKey] 
     ) AS [t2] 
    INNER JOIN [regArticles] AS [t3] ON [t2].[nArtKey] = [t3].[nArtKey] 
    INNER JOIN [regGroupConnector] AS [t4] ON [t2].[nArtKey] = [t4].[nArtKey] 
    ) AS [t7] 
WHERE [t7].[value2] > @p0 

なぜ私はそれを避けることができる余分なサブクエリを作成しますか?パフォーマンスの点では大きな違いがあるので、実際にこれを理解したいと思います。私が望むのは、数量([t2]。[value])を使用してSELECT文に入れることだけです。

このサブクエリは、グループ化後に複数の結合が存在する場合にのみ存在します。したがって、どちらか一方を削除すると、クエリによって予想されるSQLが生成されます。

注:この動作を生成する部分をそのまま維持するために、元のクエリを削除しました。

答えて

0

私はこれをテストしていませんが、これはトリック行う可能性があります:

var quantities = 
    from trans in context.vdatStockTransactions 
    group trans by trans.SKU.nArtKey into grp 
    select new 
    { 
     nQty = grp.Sum(g => g.nQty), 
     nArtKey = grp.Key 
    }; 

var results = 
    from quantity in quantities 
    join art in context.regArticles 
     on quantity.nArtKey equals art.nArtKey  
    join ca in context.regGroupConnectors 
     on quantity.nArtKey equals ca.nArtKey 
    where quantity.nQty > 0 
    select quantity; 
+0

トリックをしました!私はちょうどあなたの例でregArtSKUへの参加を追加しなければならなかった、それは不思議に働いた:)あなたの提案で私の元のクエリを変更した後、私は速いテストで約45%ありがとうございました! :) –

+0

ようこそ。 SQL Server Index Tuning Wizzardをクエリ上で実行すると、驚くべきことが起こることを忘れないでください。 – Steven