Immer wieder liest man, ein simples SELECT * FROM … sei böse und soll nicht verwendet werden. Doch warum ist das so?
-
Eine detaillierte Auflistung aller zu selektierenden Spalten ist faktisch gleichzeitig eine Dokumentation dessen, was der SELECT-Befehl zu liefern hat
-
wird damit expliziet die Reihenfolge der Spalten im Resultset definiert. Eine Änderung einer Tabelle via ALTER TABLE kann die physische Reihenfolge der Spalten ändern - und damit auch im Resultset von SELECT *
-
kann der Planner besser planen, was genau zu tun ist.
-
ganz wichtig: falls später die Tabelle um weitere Felder erweitert wird, im worst case um große TEXT oder BYTA-Felder mit großen Datenmengen (binäre Bilder z.B.), würde ein SELECT * unnötig große Datenmengen liefern, die der Client gar nicht braucht. Das SELECT * wurde ja eher geschrieben, das nun gelieferte Bild (als Beispiel) wird gar nicht gebraucht
-
Ist das Select ein JOIN über 2 oder mehr Tabellen, und eine oder mehrere dieser Tabellen werden später um neue Spalten ergänzt, kann es zu undefinierten Spaltenamen kommen:
test=*# select a.id, a.name, c.* from account a left join client c on a.id=c.id where ts > '2010-01-01'::timestamp;
id | name | id | name
----+------+----+------
(0 Zeilen)
Zeit: 0,369 ms
test=*# alter table client add column ts timestamp;
ALTER TABLE
Zeit: 0,526 ms
test=*# select a.id, a.name, c.* from account a left join client c on a.id=c.id where ts > '2010-01-01'::timestamp;
ERROR: column reference "ts" is ambiguous
ZEILE 1: ...m account a left join client c on a.id=c.id where ts > '2010...
^
test=!#
Also: in produktiven Code hat ein SELECT * nix zu suchen, und auch ein INSERT INTO … VALUES () ohne Spaltendefinition ist falsch. In JOINS sind vollständige Spaltennamen zu verwenden!
Andreas