Frage

Ich habe einige Probleme mit dem Entity Framework. Ich Ausführung eine einfache aus einer Ansicht auswählen, die in der Datenbank. Allerdings, wenn ich die SQL-Ansicht, dass EF erzeugt, wird die Ausführung der Abfrage zweimal wählen verwenden. Ist das so, wie es soll, betreiben? Es scheint sehr ineffizient.

var reads = (from rt in ctx.C2kReadsToTransfer
                     where rt.ReadDt > fromDate
                     && rt.ReadDt < toDate
                     select rt);

Dies wird in den folgenden SQL

übersetzt
SELECT 

 [Extent1].[AMRID] AS [AMRID]
 , [Extent1].[Comments] AS [Comments]
 , [Extent1].[ExternalSystemType] AS [ExternalSystemType]
 , [Extent1].[LastReadDt] AS [LastReadDt]
 , [Extent1].[ReadDt] AS [ReadDt]
 , [Extent1].[Reading] AS [Reading]
 , [Extent1].[Units] AS [Units]
 , [Extent1].[Transferred] AS [Transferred]



 FROM 
     (SELECT 
      [ReadsToTransfer].[AMRID] AS [AMRID]
      , [ReadsToTransfer].[Comments] AS [Comments]
      , [ReadsToTransfer].[ExternalSystemType] AS [ExternalSystemType]
      , [ReadsToTransfer].[LastReadDt] AS [LastReadDt]
      , [ReadsToTransfer].[ReadDt] AS [ReadDt]
      , [ReadsToTransfer].[Reading] AS [Reading]
      , [ReadsToTransfer].[Transferred] AS [Transferred]
      , [ReadsToTransfer].[Units] AS [Units]
      FROM [dbo].[ReadsToTransfer] AS [ReadsToTransfer])
    AS [Extent1]

Das scheint sehr ineffizient zu sein, vor allem, wenn der Tisch in der Nähe von 250 Millionen Zeilen enthält wie bei uns der Fall ist. Auch wenn ich eine .Nehmen (2000) auf das Ende des Codes tack, bringt es einfach ein ‚select Top 2000‘ nur auf dem ersten wählen. So ist es wählen Sie die Top-2000 von der Innenseite zu machen wählen, welche die gesamte Tabelle.

Alle Gedanken auf, das?

War es hilfreich?

Lösung

  

Das scheint sehr ineffizient zu sein

Ich glaube nicht, so ... die äußere SELECT ist nur ein Vorsprung (eigentlich eine Identität Projektion) des inneren SELECT, und einen Vorsprung hat eine vernachlässigbare Auswirkung auf die Leistung ...

Im Hinblick auf die TOP 2000-Klausel, die Tatsache, dass es auf der äußeren SELECT ist, bedeutet nicht, dass die DB alle Zeilen aus der inneren SELECT gelesen wird; es wird sie so lange lesen, wie sie durch die äußere SELECT angefordert werden, dann stoppen.

Versuchen Sie einfach die Abfrage manuell ausführen, mit oder ohne äußere SELECT: Ich wette, Sie werden keinen signifikanten Unterschied in der Leistung finden

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top