Linq to SQL: select-Optimierung
Auf große Tabellen in MSSQL; Auswahl bestimmter Spalten führt zu einer höheren Geschwindigkeit der Abfrage. Das gleiche gilt für Linq to SQL?
Wäre diese:
var person = from p in [DataContextObject].Persons
where p.PersonsID == 1
select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode };
schneller sein als dieses:
var person = from p in [DataContextObject].Persons
where p.PersonsID == 1
select p;
... ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Empfehle ich LinqPad. Es ist kostenlos und ermöglicht das ausführen von LINQ-Abfragen dynamisch. Wenn Sie können auch einen Blick auf die generierte SQL.
Was Sie sehen, ist, dass die LINQ-Abfrage übersetzen wird die erste Abfrage in der Auswahl nur diejenigen Spalten. So ist es schneller.
Wenn Sie die Begrenzung der Größe der Ergebnismenge nur durch die Auswahl ein paar bestimmte Spalten, dann JA, es wird einen Einfluss.
BEARBEITEN ading Klärung von Kommentar
Ist, wie dieses besser, es verringert sich die Größe der resultierenden Daten zurückgegeben, die von SQL-UND es verringert sich die Größe der Objekte verwendet, um zu speichern die Ergebnisse im Speicher.
Dies ist aufgrund der Tatsache, dass am Ende LINQ to SQL SQL-Generierung, also die gleichen performance-Vorteile existieren.
Gibt es 3 Aspekte, die mit "schneller" hier.
schneller. Auf der anderen Seite wird es
nicht, dass deutlich schneller,
es sei denn, Sie wählen Sie mehr als eine Zeile
oder wenn Ihre Person enthält einige
andere "schwere" Spalten - lange
varchars, Bild etc.
als J. Curran wies darauf hin, weniger
Speicher bedeutet schnellere. Gleiche Bemerkung wie bei 1. hier gilt.
Ihre Abfrage wird schneller ausgeführt, wenn Sie
ein index, der alle
ausgewählte Spalten (oder angebracht werden ab SQL Server 2005). In diesem Fall ist das SQL Server-Modul nicht laden müssen die Seite mit der Zeile im Speicher - wenn es noch nicht da ist.
Persönlich würde ich nicht die Mühe zu versuchen, zu optimieren, meine Fragen auf diese Weise (es sei denn, wie ich sagte, deine Zeilen enthalten binäre Daten, oder sehr lange Zeichenfolgen, die Sie nicht brauchen), teilweise, weil, wenn Sie später entscheiden, dass Sie möchten, um mehr Informationen über diese ausgewählte Person sind, würden Sie brauchen, um Ihre DB-Zugriff-code oder nur den Zugriff auf eine Eigenschaft in Ihrem POCO/anonyme Klasse.
Ich denke, das gleiche gilt, weil LINQ to SQL übersetzt die Linq-query-Operationen auf SQL-Befehle.
Zusätzlich zu dem, was die anderen gesagt haben, die neue Unbenannte Struktur wird eine viel leichtere Objekt als Person-Objekt -- es wäre viel schneller, auch wenn Sie alle ausgewählten Spalten. (Die Person hat Methode/Felder etc zu unterstützen, schreiben Sie das Objekt wieder in der Datenbank. Die Unbenannte Art nicht.)
Wenn Sie Spalten, die sehr groß sind, wie die Binärdateien und Bildern, dann kann es einen großen Unterschied machen, das ist der Grund, warum LINQ to SQL können Sie angeben, delay-loading für bestimmte Spalten, so dass Sie können noch wählen, ganze Objekte ohne ausführen 'wählen Sie neu' Projektionen.