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.

1voto

Wie bei den meisten Problemen hängt es davon ab, was Sie erreichen wollen. Wenn Sie ein DB-Gitter erstellen wollen, das alle Spalten einer beliebigen Tabelle zulässt, dann ist "Select *" die Antwort. Wenn Sie jedoch nur bestimmte Spalten benötigen und das Hinzufügen oder Löschen von Spalten in der Abfrage nur selten vorkommt, sollten Sie diese einzeln angeben.

Das hängt auch von der Datenmenge ab, die Sie vom Server übertragen möchten. Wenn eine der Spalten als Memo, Grafik, Blob usw. definiert ist und Sie diese Spalte nicht benötigen, sollten Sie besser nicht "Select *" verwenden, da Sie sonst einen ganzen Haufen Daten erhalten, die Sie nicht benötigen, und Ihre Leistung darunter leiden könnte.

1voto

Faisal Punkte 11

Was jeder oben sagte, plus:

Wenn Sie nach lesbarem, wartbarem Code streben, tun Sie etwas wie:

SELECT foo, bar FROM widgets;

ist sofort lesbar und zeigt Absicht. Wenn Sie diesen Anruf tätigen, wissen Sie, was Sie zurückbekommen. Wenn widgets nur die Spalten foo und bar hat, dann bedeutet die Auswahl von *, dass Sie immer noch darüber nachdenken müssen, was Sie zurückbekommen, bestätigen, dass die Reihenfolge richtig zugeordnet ist, usw. Wenn widgets jedoch mehr Spalten hat, Sie aber nur an foo und bar interessiert sind, wird Ihr Code unübersichtlich, wenn Sie einen Platzhalter abfragen und dann nur einige der zurückgegebenen Daten verwenden.

1voto

Keith Punkte 141163

Es hängt von der Version Ihres DB-Servers ab, aber moderne Versionen von SQL können den Plan so oder so zwischenspeichern. Ich würde sagen, gehen Sie mit, was am meisten wartbar mit Ihrem Datenzugriff Code ist.

1voto

HLGEM Punkte 91543

Und denken Sie daran, dass Sie bei einer inneren Verknüpfung per Definition nicht alle Spalten benötigen, da die Daten in den Verknüpfungsspalten wiederholt werden.

Es ist nicht so, dass das Auflisten von Spalten im SQl-Server schwierig oder sogar zeitaufwändig ist. Sie ziehen sie einfach aus dem Objekt-Browser (Sie können alle in einem Rutsch durch Ziehen aus dem Wort Spalten erhalten). Es ist kurzsichtig und unprofessionell, Ihr System dauerhaft zu belasten (da dies die Verwendung von Indizes einschränken kann und das Senden nicht benötigter Daten über das Netzwerk kostspielig ist) und die Wahrscheinlichkeit zu erhöhen, dass Sie unerwartete Probleme bekommen, wenn sich die Datenbank ändert (manchmal werden Spalten hinzugefügt, die der Benutzer nicht sehen soll), nur um weniger als eine Minute Entwicklungszeit zu sparen.

1voto

dpollock Punkte 185

Ein Grund dafür, dass es besser ist, genau anzugeben, welche Spalten Sie haben möchten, sind mögliche zukünftige Änderungen in der Tabellenstruktur.

Wenn Sie Daten manuell einlesen und dabei einen indexbasierten Ansatz verwenden, um eine Datenstruktur mit den Ergebnissen Ihrer Abfrage aufzufüllen, werden Sie in Zukunft, wenn Sie eine Spalte hinzufügen/entfernen, Kopfschmerzen haben, wenn Sie herausfinden wollen, was schief gelaufen ist.

Die Frage, was schneller ist, überlasse ich anderen mit ihrem Fachwissen.

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