Linq to SQL: Wählen Sie Optimierung

Auf großen Tabellen in MSSQL; Durch die Auswahl bestimmter Spalten wird die Abfrage schneller ausgeführt. Gilt das auch für Linq zu SQL?

Wäre das:

var person = from p in [DataContextObject].Persons
             where p.PersonsID == 1
             select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode };

Sei schneller als das:

var person = from p in [DataContextObject].Persons
             where p.PersonsID == 1
             select p;

...?

6

6 Antworten

Ich empfehle LinqPad . Es ist kostenlos und lässt Sie LINQ-Abfragen dynamisch ausführen. Wenn Sie sich auch das generierte SQL ansehen können.

Was Sie sehen werden, ist, dass die LINQ-Abfrage die erste Abfrage in die Auswahl nur dieser Spalten übersetzt. So ist es schneller.

6
hinzugefügt

Wenn Sie die Größe der Ergebnismenge einschränken, indem Sie nur einige spezifische Spalten auswählen, hat YES eine Auswirkung.

EDIT ading clarification from comment

Wie ist das besser, wird es die Größe der resultierenden Daten reduzieren, die von SQL zurückgegeben werden UND es wird die Größe der Objekte verringern, die verwendet werden, um die Ergebnisse im Speicher zu speichern.

Dies liegt daran, dass LINQ to SQL letztendlich SQL generiert, so dass die gleichen Leistungsvorteile bestehen.

4
hinzugefügt
Beide! SQL Server reagiert schneller, begrenzt die übertragenen Daten und reduziert die Größe der Sammlung mit den Ergebnissen, wodurch der Arbeitsspeicher reduziert wird
hinzugefügt der Autor Mitchel Sellers, Quelle
Resultierend in einer Abnahme der Speicherzuweisung? Oder größere Geschwindigkeit?
hinzugefügt der Autor roosteronacid, Quelle

Es gibt 3 Aspekte mit "schneller" hier.

  1. weniger Daten übertragen bedeutet schneller. Auf der anderen Seite wird es das bedeutend nicht schneller zu bekommen, es sei denn, Sie wählen mehr als eine Zeile aus oder wenn Ihre Person einige enthält andere "schwere" Säulen - lang Varchars, Bild etc.
  2. wie J. Curran darauf hingewiesen hat, weniger Speicher zugewiesen bedeutet schneller. Die gleiche Bemerkung wie in 1. gilt hier.

  3. Ihre Abfrage wird schneller ausgeführt, wenn Sie habe einen Index, der alle enthält ausgewählte Spalten (oder beginnend mit SQL Server 2005) In diesem Fall muss die SQL Server-Engine die Seite mit der Zeile im Speicher nicht laden, wenn sie noch nicht vorhanden ist.

Persönlich würde ich nicht versuchen, meine Abfragen auf diese Weise zu optimieren (es sei denn, wie gesagt, Ihre Zeilen enthalten binäre Daten oder sehr lange Zeichenfolgen, die Sie nicht benötigen), teilweise, weil Sie später entscheiden, dass Sie mehr haben möchten Wenn Sie Informationen zu dieser ausgewählten Person benötigen, müssen Sie Ihren DB-Zugriffscode ändern, anstatt nur auf eine Eigenschaft in Ihrer Klasse POCO/anonymer Stelle zuzugreifen.

3
hinzugefügt

Zusätzlich zu dem, was die anderen gesagt haben, wird die neue unbenannte Struktur ein viel leichteres Objekt als das Person-Objekt sein - es wäre viel schneller, selbst wenn Sie alle Spalten ausgewählt hätten. (Person hat Methode/Felder usw., um das Schreiben des Objekts in die Datenbank zu unterstützen. Der unbenannte Typ nicht.)

1
hinzugefügt

Ich denke, das gleiche gilt, weil LINQ to SQL die Linq-Abfrageoperationen in SQL-Befehle übersetzt.

1
hinzugefügt

Wenn Sie sehr große Spalten wie Binärdateien und Bilder haben, kann dies einen wesentlichen Unterschied ausmachen. Deshalb können Sie in LINQ to SQL die Verzögerung für bestimmte Spalten angeben, sodass Sie immer noch ganze Objekte auswählen können, ohne eine neue Projektion auszuwählen .

1
hinzugefügt