209 Stimmen

Was ist schneller/bester? SELECT * oder SELECT Spalte1, Spalte2, Spalte3, usw.

Ich habe gehört, dass SELECT * beim Schreiben von SQL-Befehlen zu verwenden, da es effizienter ist, die SELECT Spalten, die Sie speziell benötigen.

Wenn ich es brauche SELECT jede Spalte in einer Tabelle, sollte ich

SELECT * FROM TABLE

o

SELECT column1, colum2, column3, etc. FROM TABLE

Spielt die Effizienz in diesem Fall wirklich eine Rolle? Ich würde denken SELECT * wäre intern optimaler, wenn Sie wirklich alle Daten benötigen, aber ich sage das, ohne wirklich etwas von Datenbanken zu verstehen.

Ich bin neugierig, was in diesem Fall die beste Praxis ist.

UPDATE: Ich sollte vielleicht präzisieren, dass die einzige Situation, in der ich wirklich wollen um eine SELECT * ist, wenn ich Daten aus einer Tabelle auswähle, von der ich weiß, dass immer alle Spalten abgerufen werden müssen, auch wenn neue Spalten hinzugefügt werden.

In Anbetracht der Reaktionen, die ich gesehen habe, scheint dies jedoch immer noch eine schlechte Idee zu sein und SELECT * sollte aus viel mehr technischen Gründen, als ich je bedacht habe, niemals verwendet werden.

10voto

Die Angabe der Spaltenliste ist in der Regel die beste Option, da Ihre Anwendung nicht beeinträchtigt wird, wenn jemand eine Spalte zur Tabelle hinzufügt/einfügt.

6voto

VladV Punkte 9703

SELECT * ist eine schlechte Praxis, auch wenn die Abfrage nicht über ein Netzwerk gesendet wird.

  1. Wenn Sie mehr Daten auswählen, als Sie benötigen, wird die Abfrage weniger effizient - der Server muss zusätzliche Daten lesen und übertragen, was Zeit kostet und das System unnötig belastet (nicht nur das Netzwerk, wie bereits erwähnt, sondern auch Festplatte, CPU usw.). Außerdem ist der Server nicht in der Lage, die Abfrage so gut zu optimieren, wie er es könnte (z. B. Verwendung eines abdeckenden Index für die Abfrage).
  2. Nach einiger Zeit kann sich Ihre Tabellenstruktur ändern, so dass SELECT * einen anderen Satz von Spalten zurückgeben wird. Ihre Anwendung könnte also einen Datensatz mit unerwarteter Struktur erhalten und irgendwo in der Folge zusammenbrechen. Die explizite Angabe der Spalten garantiert, dass Sie entweder einen Datensatz mit bekannter Struktur erhalten oder einen eindeutigen Fehler auf Datenbankebene (wie "Spalte nicht gefunden").

Für ein kleines und einfaches System ist das alles natürlich nicht so wichtig.

5voto

Chris Wuestefeld Punkte 3116

Bislang wurden hier viele gute Gründe genannt. Hier ist ein weiterer, der noch nicht erwähnt wurde.

Die explizite Benennung der Spalten erleichtert Ihnen die spätere Wartung. Irgendwann werden Sie bei Änderungen oder der Fehlersuche feststellen, dass Sie sich fragen: "Wo zum Teufel wird diese Spalte verwendet".

Wenn Sie die Namen explizit aufgelistet haben, dann ist es einfach, jeden Verweis auf diese Spalte zu finden - über alle gespeicherten Prozeduren, Ansichten usw. Erstellen Sie einfach ein CREATE-Skript für Ihr DB-Schema und durchsuchen Sie es mit Text.

4voto

Yann Ramin Punkte 32375

In Bezug auf die Leistung kann SELECT mit bestimmten Spalten schneller sein (es müssen nicht alle Daten eingelesen werden). Wenn Ihre Abfrage wirklich ALLE Spalten verwendet, ist SELECT mit expliziten Parametern immer noch vorzuziehen. Der Geschwindigkeitsunterschied ist im Grunde unmerklich und nahezu zeitunabhängig. Eines Tages wird sich Ihr Schema ändern, und dies ist eine gute Versicherung, um Probleme zu vermeiden, die sich daraus ergeben.

3voto

Matthew Abbott Punkte 58885

Sie sollten wirklich nur die Felder auswählen, die Sie benötigen, und nur die erforderliche Anzahl, d. h.

SELECT Field1, Field2 FROM SomeTable WHERE --(constraints)

Außerhalb der Datenbank besteht bei dynamischen Abfragen die Gefahr von Injektionsangriffen und missgestalteten Daten. Normalerweise umgeht man dies mit gespeicherten Prozeduren oder parametrisierten Abfragen. Außerdem muss der Server jedes Mal, wenn eine dynamische Abfrage ausgeführt wird, einen Ausführungsplan erstellen (auch wenn dies nicht wirklich ein großes Problem darstellt).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X