2015-04-24 19 views
5

Ich versuche zu verstehen, warum Join in meinem Fall schneller als Anweisung, die Navigationseigenschaft verwenden, beizutreten. Ich habe zwei Fragen.Entity Framework-Leistung Join vs Navigationseigenschaft

Zuerst mit Navigationseigenschaft:

  var result = (from users in context.MetricBloodPreasure 
       orderby users.User.LastName, users.User.FirstName 
       select new 
       { 
        UserName = users.User.LastName + ", " + users.User.FirstName, 
        Date = users.DateOfValue, 
       }).ToList(); 

Generatet sql:

SELECT 
    [Project1].[C1] AS [C1], 
    [Project1].[C2] AS [C2], 
    [Project1].[DateOfValue] AS [DateOfValue] 
    FROM (SELECT 
     [Extent1].[DateOfValue] AS [DateOfValue], 
     [Extent2].[FirstName] AS [FirstName], 
     [Extent2].[LastName] AS [LastName], 
     1 AS [C1], 
     CASE WHEN ([Extent2].[LastName] IS NULL) THEN N'' ELSE [Extent2].[LastName] END + N', ' + CASE WHEN ([Extent2].[FirstName] IS NULL) THEN N'' ELSE [Extent2].[FirstName] END AS [C2] 
     FROM [dbo].[MetricBloodPreasure] AS [Extent1] 
     INNER JOIN [dbo].[User] AS [Extent2] ON [Extent1].[UserId] = [Extent2].[Id] 
    ) AS [Project1] 
    ORDER BY [Project1].[LastName] ASC, [Project1].[FirstName] ASC 

Zweite mit beitreten:

var result1 = (from u in context.User 
       orderby u.LastName, u.FirstName 
       join us in context.MetricBloodPreasure 
        on u.Id equals us.UserId into users 
       from s in users 
       select new 
       { 
        UserName = s.User.LastName + ", " + s.User.FirstName, 
        Date = s.DateOfValue, 
       }).ToList(); 

generierten SQL:

SELECT 
    1 AS [C1], 
    CASE WHEN ([Extent1].[LastName] IS NULL) THEN N'' ELSE [Extent1].[LastName] END + N', ' + CASE WHEN ([Extent1].[FirstName] IS NULL) THEN N'' ELSE [Extent1].[FirstName] END AS [C2], 
    [Extent2].[DateOfValue] AS [DateOfValue] 
    FROM [dbo].[User] AS [Extent1] 
    INNER JOIN [dbo].[MetricBloodPreasure] AS [Extent2] ON ([Extent1].[Id] = [Extent2].[UserId]) AND ([Extent2].[UserId] = [Extent1].[Id]) 

Bevor Sie die erste Abfrage ausführen, rufen Sie var user = context.User.FirstOrDefault(); auf, da ich denke, dass die Verbindung zur Datenbank einige Zeit braucht.

Ergebnisse: Navigation Eigenschaft query: 00: 00: 00,6719646 Abfrage Registriert: 00: 00: 00,4941169

auf Ergebnisse der Suche scheint es, dass Linq, dass die Verwendung abfragt statt Navigationseigenschaften schließt sich schneller. Ist das wahr oder mache ich etwas falsch?

+0

Sie müssen auch den Cache aus der Datenbank zwischen den Abfragen löschen, um korrekte Ergebnisse zu erhalten, während Sie ToList() aufrufen. Trennen Sie die Abfragekonstruktion von der Materialisierung und benchmarken Sie diese. –

+0

Die OrderBy scheint in der zweiten Abfrage nicht berücksichtigt zu werden. Dies kann die Ursache für den Unterschied sein, Sie können versuchen, ... von s in Benutzerreihenfolge durch u.LastName, u.FirstName ... ' – jbl

Antwort

2

Um einen besseren Einblick in das, was es tut, sollten Sie die rohe SQL und Sie können den Ausführungsplan selbst auschecken.

Um dies zu tun, können Sie entweder SQL Profiler verwenden, um zu sehen, welche Abfrage ausgeführt wird, oder Sie können die SQL-Abfrage selbst anmelden, indem Sie so etwas wie dies zu tun, bevor Sie Ihre Abfrage:

context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); 

auch tun Ein einfacher Benchmark wie Sie, indem Sie jedes Mal laufen, wird nicht unbedingt zuverlässig sein. Sie sollten es mehrmals ausführen und die Dinge ausmitteln. Sie sollten sie auch in der umgekehrten Reihenfolge ausführen, um zu sehen, ob sich dies auch ändert.

+0

Darüber hinaus Einfügen von mehr Daten in die Datenbank ist eine gute Idee, dies sollte einen Unterschied markieren (wenn existiert) –

+0

beide Abfragen über 9000 Zeilen zurückgegeben ... und ja, ich benutze Protokoll und führen Sie die Abfragen mit neuen Instanz meines Datenbankkontextes. Join ist noch schneller. – puko

+0

Können Sie das SQL, das in der ursprünglichen Frage ausgeführt wird, veröffentlichen? Haben Sie die SQL im SSMS ausgeführt und den Ausführungsplan aktiviert, damit Sie sehen können, wo die Unterschiede liegen? –

Verwandte Themen