列的位置是否会影响性能?
在执行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
};
C)
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
};
我期待查询B到是最有效的,由于用于各列的位置连接导致生成更干净的SQL代码,但我可能是错的。
如果重要,查询将在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());
看来,加入了列的顺序可能会影响执行的速度 - 或指出我的数据库可能效率低下:)
无论如何,我想发布任何谁发现这个有趣的发现。
在SQL中,顺序加入和列通常并不重要:只要你有一个很好的SQL优化器,你有你的数据库的良好的统计,则数据库引擎将重组的最大性能查询。
一般,这是不真正的LINQ:不同于SQL,语句不重新排序执行,而是在他们输入相同的顺序进行懒洋洋地。如果您抓住空间分离的数据,或者选择错误的合并顺序,则执行速度将会受到影响。
好消息是你应该安全。对于LINQ to SQL或LINQ to Entities,虽然生成的SQL(通常)与您键入的顺序大致相同,但仍然会触及SQL数据库的优化引擎。在这种情况下,连接顺序和列名一般为无关紧要。
一如既往,糟糕的统计数据或糟糕的数据库优化器仍然可以咬你。在这种情况下,不要问StackOverflow,最好的办法是通过分解SQL Profiler来检查实际使用的查询计划。
谢谢,我会进一步追求数据库本身。但很高兴知道LINQ如何构建查询。感谢您的信息。 –
你检查过sql是否在所有版本之间有所不同? –