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.

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).

3voto

Nick Berardi Punkte 53415

Definieren Sie die Spalten auf jeden Fall, denn SQL Server muss die Spalten nicht nachschlagen, um sie abzurufen. Wenn Sie die Spalten definieren, dann kann SQL diesen Schritt überspringen.

3voto

BrewinBombers Punkte 1482

Es ist immer besser, die benötigten Spalten zu spezifizieren. Wenn Sie einmal darüber nachdenken, muss SQL nicht bei jeder Abfrage nachdenken: "Was ist *? Außerdem kann es vorkommen, dass später jemand der Tabelle Spalten hinzufügt, die Sie in Ihrer Abfrage eigentlich nicht brauchen, und in diesem Fall sind Sie besser dran, wenn Sie alle Spalten angeben.

3voto

Alexandre Brasil Punkte 134

Das Problem mit "select *" ist die Möglichkeit, Daten zu erhalten, die Sie nicht wirklich benötigen. Bei der eigentlichen Datenbankabfrage tragen die ausgewählten Spalten nicht wirklich zu den Berechnungen bei. Was wirklich "schwer" ist, ist der Datentransport zurück zu Ihrem Client, und jede Spalte, die Sie nicht wirklich brauchen, verschwendet nur Netzwerkbandbreite und verlängert die Zeit, die Sie auf die Rückgabe Ihrer Abfrage warten.

Selbst wenn Sie alle Spalten aus einem "select *..." verwenden, ist das nur für den Moment. Wenn Sie in Zukunft das Layout der Tabelle/Ansicht ändern und weitere Spalten hinzufügen, werden Sie diese in Ihre Selects aufnehmen, auch wenn Sie sie nicht benötigen.

Ein weiterer Punkt, an dem eine "select *"-Anweisung schlecht ist, ist bei der Erstellung von Ansichten. Wenn Sie eine Ansicht mit "select *" erstellen und später Spalten zu Ihrer Tabelle hinzufügen, stimmen die Definition der Ansicht und die zurückgegebenen Daten nicht überein, und Sie müssen Ihre Ansichten neu kompilieren, damit sie wieder funktionieren.

Ich weiß, dass es verlockend ist, ein "select *" zu schreiben, denn ich mag es wirklich nicht, alle Felder in meinen Abfragen manuell zu spezifizieren, aber wenn Ihr System anfängt, sich zu entwickeln, werden Sie sehen, dass es sich lohnt, diese zusätzliche Zeit/Aufwand in die Spezifizierung der Felder zu investieren, anstatt viel mehr Zeit und Aufwand in die Beseitigung von Fehlern in Ihren Ansichten oder die Optimierung Ihrer Anwendung zu investieren.

2voto

Don Punkte 9081

Die Benennung jeder Spalte, die Sie in Ihrer Anwendung erwarten, stellt auch sicher, dass Ihre Anwendung nicht zusammenbricht, wenn jemand die Tabelle ändert, solange Ihre Spalten noch vorhanden sind (in beliebiger Reihenfolge).

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