Was ist der effizienteste Weg, um einen geordneten Bereich mit EntityFramework zu erhalten?

9

Problemstellung

Ich habe einen großen Datensatz, für den ich eine komplexe Berechnung durchführen muss. Für meine Berechnung muss ich einen Teil der geordneten Daten aus einem großen Satz basierend auf Eingabeparametern nehmen.

Meine Methodensignatur sieht folgendermaßen aus:

%Vor%

Mögliche Lösungen

Die beiden folgenden Methoden fallen mir ein:

Methode 1 - WHERE-Klausel

%Vor%

Methode 2 - überspringen & amp; Nimm

%Vor%

Frage

Wenn ich das hier nur zusammenarbeite, würde ich wahrscheinlich nur mit Methode 1 gehen, aber die Größe meines Datasets und die Größe der Datensätze sind zu groß, um sie zu ignorieren Effizienzverluste, und es ist von entscheidender Bedeutung, dass die resultierende Aufzählung geordnet ist.

Welcher Ansatz wird die effizientere Abfrage generieren? Und gibt es einen effizienteren Ansatz, den ich noch berücksichtigen muss?

Alle vorgestellten Lösungen können die sichere Annahme machen, dass die Tabelle gut indiziert ist.

    
mirichan 20.04.2015, 09:00
quelle

2 Antworten

2

SkipWhile wird für die Übersetzung in SQL nicht unterstützt. Sie müssen diese Option wegwerfen.

Am besten erstellen Sie einen Index für das Feld, das Sie für die Bereichsauswahl verwenden, und geben Sie dann eine Abfrage aus, die SARGable ist. where date >= start && date < end ist SARGable und kann einen Index verwenden.

!start.HasValue || ist keine gute Idee, da dies die SARGability zerstört. Erstellen Sie die Abfrage, sodass diese nicht benötigt wird. Zum Beispiel:

%Vor%

Machen Sie den Index deckend und Sie haben optimale Leistung. Es gibt keine einzige zusätzliche Zeile, die verarbeitet werden muss.

    
usr 20.04.2015, 12:03
quelle
2

Nach link Sie können SkipWhile nicht verwenden, ohne eine Abfrage zu materialisieren. In 2. Fall materialisieren Sie alle Entitäten und berechnen dann das Ergebnis.

Im 1.Szenario können Sie sql diese Abfrage verarbeiten lassen und nur notwendige Datensätze materialisieren, also ist es die bessere Option.

BEARBEITEN:

Ich schrieb Beispieldaten, Anfragen an die Datenbank:

  1. SELECT [Project1].[Id] AS [Id], [Project1].[AddedDate] AS [AddedDate], [Project1].[SendDate] AS [SendDate] FROM ( SELECT [Extent1].[Id] AS [Id], [Extent1].[AddedDate] AS [AddedDate], [Extent1].[SendDate] AS [SendDate]
    FROM [dbo].[Alerts] AS [Extent1] WHERE ([Extent1].[AddedDate] >= @p__linq__0) AND ([Extent1].[AddedDate] <= @p__linq__1) ) AS [Project1] ORDER BY [Project1].[AddedDate] ASC

  2. SELECT [Extent1].[Id] AS [Id], [Extent1].[AddedDate] AS [AddedDate], [Extent1].[SendDate] AS [SendDate] FROM [dbo].[Alerts] AS [Extent1] ORDER BY [Extent1].[AddedDate] ASC

Ich habe 1 000 000 Datensätze eingefügt und eine Abfrage mit der erwarteten 1 Zeile in das Ergebnis geschrieben. In einem Fall betrug die Abfragezeit 291 ms und trat sofort ein. Im zweiten Fall betrug die Abfragezeit 1065 ms und ich musste etwa 10 Sekunden warten, um das Ergebnis zu materialisieren;

    
Marcin J 20.04.2015 11:55
quelle