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.

0voto

Allan Wind Punkte 10794

Wenn Sie Wert auf Schnelligkeit legen, sollten Sie vorbereitete Erklärungen verwenden. Ansonsten stimme ich ilitirit zu, dass man sich vor Veränderungen schützen muss.

/Allan

0voto

mxsscott Punkte 353

Ich empfehle immer, die benötigten Spalten anzugeben, nur für den Fall, dass sich Ihr Schema ändert und Sie die zusätzliche Spalte nicht benötigen.

Außerdem müssen die Spaltennamen mit dem Tabellennamen ergänzt werden. Dies ist wichtig, wenn die Abfrage Joins enthält. Ohne die Tabellenqualifikationen kann es schwierig sein, sich zu merken, welche Spalte aus welcher Tabelle stammt, und das Hinzufügen einer ähnlich benannten Spalte zu einer der anderen Tabellen kann Ihre Abfrage zerstören.

0voto

Verwenden Sie spezifische Feldnamen, damit Sie keine unerwarteten Ergebnisse erhalten, wenn jemand die Tabelle ändert. Zu diesem Thema: Geben Sie beim Einfügen IMMER Feldnamen an, damit Sie, wenn Sie später eine Spalte hinzufügen müssen, nicht zurückgehen und Ihr Programm korrigieren und gleichzeitig die Datenbank in der Produktionsversion ändern müssen.

0voto

Scott Lawrence Punkte 6695

Ob die Effizienz eine Rolle spielt, hängt stark von der Größe Ihrer Produktionsdatensätze (und deren Wachstumsrate) ab. Wenn Ihre Datensätze nicht so groß sind und nicht so schnell wachsen, bietet die Auswahl einzelner Spalten möglicherweise keinen großen Leistungsvorteil.

Bei größeren Datensätzen und schnellerem Datenwachstum wird der Leistungsvorteil immer wichtiger.

Um grafisch zu sehen, ob es einen Unterschied gibt oder nicht, würde ich vorschlagen, den Abfrageanalysator zu verwenden, um den Abfrageausführungsplan für ein SELECT * und das entsprechende SELECT col1, col2 usw. zu sehen. Daran sollten Sie erkennen können, welche der beiden Abfragen effizienter ist. Sie könnten auch einige Testdaten mit unterschiedlichen Volumina generieren, um die Timings zu ermitteln.

0voto

HLGEM Punkte 91543

Es ist besonders wichtig für die Leistung, select * nicht zu verwenden, wenn Sie eine Verknüpfung haben, da definitionsgemäß mindestens zwei Felder dieselben Daten enthalten. Sie möchten keine Netzwerkressourcen verschwenden, indem Sie Daten, die Sie nicht benötigen, vom Datenbankserver an den Anwendungs- oder Webserver senden. Es mag einfacher erscheinen, select * zu verwenden, aber es ist eine schlechte Praxis. Da es einfach ist, die Spaltennamen in die Abfrage zu ziehen, sollten Sie dies stattdessen tun.

Ein weiteres Problem, das bei der Verwendung von select * auftritt, ist, dass es Idioten gibt, die neue Felder in der Mitte der Tabelle hinzufügen (immer eine schlechte Praxis). Wenn Sie select * als Grundlage für eine Einfügung verwenden, kann die Reihenfolge der Spalten plötzlich falsch sein, und Sie können versuchen, die Sozialversicherungsnummer in das Honorar einzufügen (der Geldbetrag, der einem Redner gezahlt wird, um ein nicht zufälliges Beispiel zu wählen), was für die Datenintegrität sehr schlecht sein kann. Selbst wenn es sich bei der Auswahl nicht um eine Einfügung handelt, sieht es für den Kunden schlecht aus, wenn die Daten im Bericht oder auf der Webseite plötzlich in der falschen Reihenfolge erscheinen.

Mir fällt kein Umstand ein, unter dem die Verwendung von select * der Verwendung einer Spaltenliste vorzuziehen wäre. Man könnte meinen, dass es einfacher zu pflegen ist, aber in Wahrheit ist es das nicht und wird dazu führen, dass Ihre Anwendung grundlos langsamer wird, wenn Felder, die Sie nicht benötigen, zu den Tabellen hinzugefügt werden. Sie werden auch mit dem Problem konfrontiert werden, Dinge zu reparieren, die bei Verwendung einer Spaltenliste nicht kaputt gegangen wären.

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