2012-10-04 2 views
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 
         }; 

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#을 통해 신속하게 (확실하게 비 절대) 벤치 마크를 실행 무엇을 위해 --Edit--

. 내 연구 결과는 다음과 같습니다 :

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의 버전이 다른지 확인 했습니까? –

답변

1

SQL에서 조인과 열 순서는 입니다. 일반적으로은 중요하지 않습니다. 좋은 SQL 최적화 프로그램이 있고 데이터베이스에 대한 통계가 양호한 경우 데이터베이스 엔진은 최대 성능을 위해 쿼리를 재구성합니다. 일반적으로에서

, 즉 LINQ에 대한 하지 사실이다 : SQL과는 달리, 명령문이 실행 순서가되지 않지만, 대신에 게으르게가 입력되어 같은 순서로 수행. 공간적으로 분리 된 데이터를 얻거나 병합 순서를 잘못 선택하면 실행 속도가 저하됩니다.

좋은 소식은 당신이 안전해야한다는 것입니다. LINQ to SQL 또는 LINQ to Entities의 경우 생성 된 SQL은 일반적으로 입력 한 순서와 대략 동일한 순서로 처리되지만 SQL 데이터베이스의 최적화 엔진을 계속 사용합니다. 이 경우 조인 및 열 이름 의 순서는 일반적으로이 아닙니다.

항상 그렇듯이 통계가 좋지 않거나 데이터베이스 최적화 프로그램이 좋지 않은 경우에도 여전히 문제가 될 수 있습니다. 이 경우 StackOverflow에 대해 묻는 대신 SQL 프로필러를 사용하여 실제로 사용중인 쿼리 계획을 확인하는 것이 가장 좋습니다.

+0

감사합니다. 데이터베이스 자체에 대해 더 자세히 살펴 보겠습니다. 그러나 LINQ가 쿼리를 작성하는 방법을 알고 있으면 좋습니다. 정보 주셔서 감사합니다. –

관련 문제