結合する列の配置は、LINQ ステートメントを実行する際のパフォーマンスに影響しますか?
たとえば、次のクエリのうちどれが最も速く実行されますか? その理由は?
A)
var query = from o in entities.orders
join i in entities.order_items
on o.OrderId equals i.OrderId
where o.AddedSalesOrder == 0
select new
{
i.ShippingFirstName,
i.ShippingLastName,
i.Sku,
i.Quantity,
i.ItemPrice,
o.TotalShippingCost,
o.OrderId,
o.OrderCreateDate
};
B)
var query = from o in entities.orders
join i in entities.order_items
on o.OrderId equals i.OrderId
where o.AddedSalesOrder == 0
select new
{
o.TotalShippingCost,
o.OrderId,
o.OrderCreateDate,
i.ShippingFirstName,
i.ShippingLastName,
i.Sku,
i.Quantity,
i.ItemPrice
};
ハ)
var query = from o in entities.orders
join i in entities.order_items
on o.OrderId equals i.OrderId
where o.AddedSalesOrder == 0
select new
{
o.OrderCreateDate,
i.ShippingFirstName,
i.ShippingLastName,
o.TotalShippingCost,
o.OrderId,
i.Sku,
i.Quantity,
i.ItemPrice
};
結合の列の配置により、よりクリーンな SQL コードが生成されるため、クエリ B が最も効率的であると予想していますが、間違っている可能性があります。
問題がある場合、クエリは SQL Server 2008r2 データベースで実行されています。
- 編集 -
どのような価値があるのかというと、C# を介して簡単な (絶対的ではない) ベンチマークを実行し、各シナリオでパフォーマンスがどのように動作するかを確認しました。私の調査結果は以下のとおりです。
a) 297.61 millisecond avg over 100000 iterations
b) 245.90 millisecond avg over 100000 iterations
c) 304.16 millisecond avg over 100000 iterations
これをテストするために使用したコードは次のとおりです。
var sw = new Stopwatch();
List<long> totalTime = new List<long>();
for (int u = 0; u < 100000; u++)
{
sw.Start();
var entities = new Entities();
var query = from o in entities.orders
join i in entities.order_items
on o.OrderId equals i.OrderId
where o.AddedSalesOrder == 1
select new
{
i.ShippingFirstName,
i.ShippingLastName,
i.Sku,
i.Quantity,
i.ItemPrice,
o.TotalShippingCost,
o.OrderId,
o.OrderCreateDate
};
var qc = query.Count();
sw.Stop();
totalTime.Add(sw.ElapsedMilliseconds);
sw.Reset();
}
Console.WriteLine("Average time in Milliseconds: {0}", totalTime.Average());
結合された列の順序が実行速度に影響を与える可能性があるようです-または指摘されたように、私のデータベースは非効率的かもしれません:)
とにかく、これが面白いと思う人のために調査結果を投稿したかった.