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が生成されます。
注:この動作を生成する部分をそのまま維持するために、元のクエリを削除しました。
トリックをしました!私はちょうどあなたの例でregArtSKUへの参加を追加しなければならなかった、それは不思議に働いた:)あなたの提案で私の元のクエリを変更した後、私は速いテストで約45%ありがとうございました! :) –
ようこそ。 SQL Server Index Tuning Wizzardをクエリ上で実行すると、驚くべきことが起こることを忘れないでください。 – Steven