2

結合する列の配置は、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());

結合された列の順序が実行速度に影響を与える可能性があるようです-または指摘されたように、私のデータベースは非効率的かもしれません:)

とにかく、これが面白いと思う人のために調査結果を投稿したかった.

4

1 に答える 1

1

SQL では、通常、結合と列の順序は重要ではありません。適切な SQL オプティマイザーがあり、データベースに適切な統計がある場合、データベース エンジンはクエリを再構築してパフォーマンスを最大化します。

一般に、これはLINQ には当てはまりません。SQL とは異なり、ステートメントは実行のために並べ替えられず、入力された順序で遅延して実行されます。空間的に離れたデータを取得したり、不適切なマージ順序を選択したりすると、実行速度が低下します。

良いニュースは、あなたが安全であるべきだということです。LINQ to SQL または LINQ to Entities の場合、生成された SQL は (通常) 入力した順序とほぼ同じですが、SQL データベースの最適化エンジンを使用することになります。この場合、通常、結合と列名の順序は重要ではありません。

いつものように、悪い統計や貧弱なデータベース オプティマイザーは依然としてあなたを苦しめる可能性があります。この場合、StackOverflow で質問するよりも、SQL Profiler を分割して実際に使用されているクエリ プランを確認するのが最善の策です。

于 2012-10-04T14:57:47.767 に答える