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.

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

2voto

Lahiru Cooray Punkte 122

In Bezug auf die Leistung habe ich Kommentare gesehen, dass beide gleich sind, aber in Bezug auf die Benutzerfreundlichkeit gibt es einige Pluspunkte und Minuspunkte.

Wenn Sie ein (select *) in einer Abfrage verwenden und jemand die Tabelle ändert und neue Felder hinzufügt, die für die vorherige Abfrage nicht benötigt werden, ist das ein unnötiger Overhead. Und was, wenn das neu hinzugefügte Feld ein Blob oder ein Bildfeld ist??? Ihre Abfrage-Antwortzeit wird dann wirklich langsam sein.

Auf der anderen Seite, wenn Sie eine (select col1,col2, ) verwenden und wenn die Tabelle geändert und neue Felder hinzugefügt werden und wenn diese Felder in der Ergebnismenge benötigt werden, müssen Sie immer Ihre Select-Abfrage nach der Änderung der Tabelle bearbeiten.

Aber ich schlage vor, immer select col1,col2,... in Ihren Abfragen zu verwenden und die Abfrage zu ändern, wenn die Tabelle später geändert wird...

2voto

user9385 Punkte 31

Es ist NICHT schneller, explizite Feldnamen im Vergleich zu * zu verwenden, wenn, und nur wenn, Sie die Daten für alle Felder abrufen müssen.

Ihre Client-Software sollte nicht von der Reihenfolge der zurückgegebenen Felder abhängen, also ist auch das unsinnig.

Und es ist möglich (wenn auch unwahrscheinlich), dass Sie alle Felder mit * abrufen müssen, weil Sie noch nicht wissen, welche Felder existieren (denken Sie an eine sehr dynamische Datenbankstruktur).

Ein weiterer Nachteil der Verwendung expliziter Feldnamen besteht darin, dass das Lesen des Codes und/oder des Abfrageprotokolls erschwert wird, wenn es viele davon gibt und sie lang sind.

Die Regel sollte also lauten: Wenn Sie alle Felder benötigen, verwenden Sie *, wenn Sie nur eine Teilmenge benötigen, benennen Sie diese explizit.

2voto

Dies ist ein alter Beitrag, aber immer noch gültig. Als Referenz, ich habe eine sehr komplizierte Abfrage, bestehend aus:

  • 12 Tische
  • 6 Linke Fugen
  • 9 innere Fugen
  • 108 Gesamtspalten in allen 12 Tabellen
  • Ich brauche nur 54 Spalten
  • Eine 4 spaltige Order By Klausel

Wenn ich die Abfrage mit Select * ausführe, dauert es durchschnittlich 2869 ms. Wenn ich die Abfrage mit Select ausführe, dauert es im Durchschnitt 1513 ms.

Die Gesamtzahl der zurückgegebenen Zeilen beträgt 13.949.

Es besteht kein Zweifel, dass die Auswahl von Spaltennamen eine schnellere Leistung als Select *

1voto

Dela Punkte 400

Wenn alle Spalten, die Sie auswählen, in einem Index enthalten sind, wird Ihre Ergebnismenge aus dem Index gezogen, anstatt zusätzliche Daten aus SQL abzurufen, um zu ergänzen, was alle anderen gesagt haben.

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