列的位置是否会影响性能?

问题描述:

在执行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()); 

看来,加入了列的顺序可能会影响执行的速度 - 或指出我的数据库可能效率低下:)

无论如何,我想发布任何谁发现这个有趣的发现。

+0

你检查过sql是否在所有版本之间有所不同? –

在SQL中,顺序加入和列通常并不重要:只要你有一个很好的SQL优化器,你有你的数据库的良好的统计,则数据库引擎将重组的最大性能查询。

一般,这是真正的LINQ:不同于SQL,语句不重新排序执行,而是在他们输入相同的顺序进行懒洋洋地。如果您抓住空间分离的数据,或者选择错误的合并顺序,则执行速度将会受到影响。

好消息是你应该安全。对于LINQ to SQL或LINQ to Entities,虽然生成的SQL(通常)与您键入的顺序大致相同,但仍然会触及SQL数据库的优化引擎。在这种情况下,连接顺序和列名一般为无关紧要。

一如既往,糟糕的统计数据或糟糕的数据库优化器仍然可以咬你。在这种情况下,不要问StackOverflow,最好的办法是通过分解SQL Profiler来检查实际使用的查询计划。

+0

谢谢,我会进一步追求数据库本身。但很高兴知道LINQ如何构建查询。感谢您的信息。 –