SQL-Abfrage - Wählen Sie * aus Sicht oder Wählen Sie Spalte1, Spalte2, ... SpalteN aus Sicht

8

Wir verwenden SQL Server 2005, aber diese Frage kann für jedes RDBMS gestellt werden.

Welche der folgenden Optionen ist bei der Auswahl aller Spalten in einer Ansicht effizienter?

%Vor%

oder

%Vor%     
Napco 24.09.2008, 17:08
quelle

10 Antworten

35

NIEMALS NUTZEN SIE "SELECT *" !!!!

Dies ist die Grundregel des Abfrageentwurfs!

Dafür gibt es mehrere Gründe. Eine davon ist, dass, wenn Ihre Tabelle nur drei Felder enthält und Sie alle drei Felder im Code verwenden, der die Abfrage aufruft, es eine große Wahrscheinlichkeit gibt, dass Sie mehr Felder zu dieser Tabelle hinzufügen, wenn die Anwendung wächst und wenn Ihre Select * -Abfrage sollte nur diese 3 Felder für den aufrufenden Code zurückgeben, dann ziehen Sie viel mehr Daten aus der Datenbank als Sie benötigen.

Ein weiterer Grund ist die Leistung. Denken Sie beim Abfragedesign nicht so sehr an die Wiederverwendbarkeit wie dieses Mantra:

Nimm alles, was du essen kannst, aber iss alles was du nimmst.

    
devlord 24.09.2008, 17:13
quelle
11

Es empfiehlt sich, jede Spalte nach ihrem Namen auszuwählen. Zukünftig könnte sich Ihr DB-Schema ändern, um Spalten hinzuzufügen, die Sie dann für eine bestimmte Abfrage nicht benötigen würden. Ich würde empfehlen, jede Spalte nach ihrem Namen auszuwählen.

    
Gthompson83 24.09.2008 17:10
quelle
3

Um nur einen Punkt zu verdeutlichen, den mehrere Leute bereits gemacht haben, ist der Grund, warum Select * ineffizient ist, dass es einen ersten Aufruf an die Datenbank gibt, um genau herauszufinden, welche Felder verfügbar sind, und dann einen zweiten Aufruf, wo die Abfrage steht wird mit expliziten Spalten erstellt.

Fühlen Sie sich frei, Select * zu verwenden, wenn Sie debuggen, einfache Abfragen ausführen oder sich in der Anfangsphase der Entwicklung einer Abfrage befinden, aber sobald Sie die erforderlichen Spalten kennen, geben Sie diese explizit an.

    
CJM 25.09.2008 09:52
quelle
2

Wählen Sie * ist eine schlechte Programmierpraxis. Es ist genauso wahrscheinlich, Dinge zu zerstören, als Dinge zu retten. Wenn Sie nur eine Tabelle oder Ansicht abfragen, ist die Effizienzsteigerung möglicherweise nicht vorhanden (obwohl dies möglich ist, wenn Sie nicht beabsichtigen, jedes Feld tatsächlich zu verwenden). Wenn Sie einen inneren Join haben, haben Sie mindestens zwei Felder, die die gleichen Daten (die Join-Felder) zurückgeben und somit verschwenden Sie Netzwerkressourcen, um redundante Daten zurück an die Anwendung zu senden. Sie werden dies zunächst nicht bemerken, aber da die Ergebnismengen immer größer werden, haben Sie bald eine Netzwerk-Pipeline, die voll ist und nicht sein muss. Ich kann mir keinen Fall vorstellen, in dem Sie mit * etwas gewinnen können. Wenn eine neue Spalte hinzugefügt wird und Sie nicht zum Code gehen müssen, um etwas damit zu tun, sollte die Spalte nicht per Definition von Ihrer Abfrage zurückgegeben werden. Wenn jemand die Tabelle mit den Spalten in einer anderen Reihenfolge löscht und neu erstellt, haben alle Ihre Abfragen Informationen, die falsch angezeigt werden oder fehlerhafte Ergebnisse liefern, z. B. wenn der Preis in das Teilnummernfeld eines neuen Datensatzes eingegeben wird.

Plus es ist schnell, die Spaltennamen aus dem Objektbrowser zu ziehen, so dass es nur pure Faulheit ist nicht effizient in der Codierung.

    
HLGEM 24.09.2008 17:44
quelle
0

Wenn Sie wirklich alle Spalten auswählen, sollte es keinen merklichen Unterschied machen, ob Sie nach * fragen oder ob Sie explizit sind. Der SQL-Server analysiert die Anfrage in etwa der gleichen Zeit auf die gleiche Weise.

    
Adam Bellaire 24.09.2008 17:10
quelle
0

Wählen Sie immer col1, col2 usw. aus der Ansicht. Es gibt keinen Effizienzunterschied zwischen den beiden bekannten Methoden, aber die Verwendung von "Select *" kann gefährlich sein. Wenn Sie Ihre Ansichtsdefinition ändern, indem Sie neue Spalten hinzufügen, können Sie ein Programm mit "select *" brechen, während die Auswahl einer vordefinierten Gruppe von Spalten (sogar alle von ihnen, named) funktioniert.

    
Mike McAllister 24.09.2008 17:12
quelle
0

Ich schätze, alles hängt davon ab, was der Abfrageoptimierer tut.

Wenn ich jeden Datensatz in der Reihe haben möchte, benutze ich generell die Option "SELECT * ...", da ich mich dann keine Sorgen machen muss, sollte ich die zugrundeliegende Tabellenstruktur ändern. Für jemanden, der den Code verwaltet, sagt ihnen "SELECT *", dass diese Abfrage jede Spalte zurückgeben soll, während die Auflistung der einzelnen Spalten nicht die gleiche Absicht hat.

    
Ken Ray 24.09.2008 17:13
quelle
0

Für die Leistung - sehen Sie sich den Abfrageplan an (sollte keinen Unterschied machen).

Für Wartbarkeit. - Liefern Sie immer eine Feldliste (das gilt auch für INSERT INTO).

    
Amy B 24.09.2008 17:51
quelle
0
%Vor%

dieser ist mehr Optimierer als mit

%Vor%     
Alireza Masali 13.06.2012 06:33
quelle
0

Es kommt darauf an. Die Vererbung von Sichten kann praktisch und einfach zu warten sein (SQL Anywhere):

%Vor%     
Simon 17.11.2010 08:51
quelle

Tags und Links