In SQL Server 2012 (oder einer beliebigen Version ab 2005) ist die Verwendung SELECT *...
nur ein mögliches Leistungsproblem in der SELECT-Anweisung der obersten Ebene einer Abfrage.
Es ist also KEIN Problem in Views (*), in Unterabfragen, in EXIST-Klauseln, in CTEs oder in SELECT COUNT(*)..
usw. usw. Beachten Sie, dass dies wahrscheinlich auch für Oracle, DB2 und möglicherweise PostGres gilt (nicht sicher). , aber es ist sehr wahrscheinlich, dass es in vielen Fällen immer noch ein Problem für MySql ist.
Um zu verstehen, warum (und warum es in einem SELECT der obersten Ebene immer noch ein Problem sein kann), ist es hilfreich zu verstehen, warum es jemals ein Problem war, denn die Verwendung von SELECT *..
bedeutet " ALLE Spalten zurückgeben ". Im Allgemeinen werden dadurch viel mehr Daten zurückgegeben, als Sie wirklich möchten, was offensichtlich zu viel mehr E / A führen kann, sowohl auf der Festplatte als auch im Netzwerk.
Weniger offensichtlich ist, dass dies auch einschränkt, welche Indizes und Abfragepläne ein SQL-Optimierer verwenden kann, da er weiß, dass er letztendlich alle Datenspalten zurückgeben muss. Wenn das Unternehmen im Voraus weiß, dass Sie nur bestimmte Spalten benötigen, kann es häufig effizientere Abfragepläne verwenden, indem es Indizes nutzt, die nur diese Spalten enthalten. Glücklicherweise gibt es eine Möglichkeit, dies im Voraus zu wissen, dh Sie können die gewünschten Spalten in der Spaltenliste explizit angeben. Aber wenn Sie "*" verwenden, verzichten Sie zugunsten von "Geben Sie mir einfach alles, ich werde herausfinden, was ich brauche."
Ja, die Verarbeitung jeder Spalte erfordert zusätzlichen CPU- und Arbeitsspeicherbedarf, ist jedoch im Vergleich zu diesen beiden Faktoren fast immer geringfügig: die erhebliche zusätzliche Festplatten- und Netzwerkbandbreite, die für nicht benötigte Spalten erforderlich ist, und die Notwendigkeit, weniger zu verwenden optimierter Abfrageplan, da er jede Spalte enthalten muss.
Was hat sich also geändert? Grundsätzlich haben die SQL-Optimierer erfolgreich eine Funktion namens "Spaltenoptimierung" integriert, die nur bedeutet, dass sie jetzt in den Unterabfragen der unteren Ebene herausfinden können, ob Sie jemals tatsächlich eine Spalte in den oberen Ebenen der Abfrage verwenden werden.
Das Fazit ist, dass es keine Rolle mehr spielt, wenn Sie 'SELECT * ..' in den unteren / inneren Ebenen einer Abfrage verwenden. Entscheidend ist vielmehr, was sich in der Spaltenliste des SELECT der obersten Ebene befindet. Sofern Sie nicht SELECT *..
oben verwenden, muss erneut davon ausgegangen werden, dass ALLE Spalten gewünscht werden , und daher können Spaltenoptimierungen nicht effektiv eingesetzt werden.
(* - Beachten Sie, dass es in Views ein anderes, geringfügiges Bindungsproblem gibt, bei *
dem die Änderung in Spaltenlisten nicht immer registriert wird, wenn "*" verwendet wird. Es gibt andere Möglichkeiten, dies zu beheben, und dies wirkt sich nicht auf die Leistung aus.)