de.comp.lang.php FAQ

16.14. Warum soll ich nicht SELECT * schreiben?

Keywords: SQL | Select | Wildcard | Performance

Antwort von Johannes Frömter

Bei der SQL-Anweisung SELECT * FROM ... muss das Datenbank-Management-System (DBMS) alle Spalten der betreffenden Datensätze selektieren, auch wenn in der anschließenden Verarbeitung nur ein Teil davon wirklich gebraucht wird. Das ist langsam und schlicht und einfach unsinnig, und die unnötigen Spalten verhindern unter Umständen, dass der integrierte Optimizer die Query effizient ausführen kann.

Selbst wenn alle Spalten tatsächlich benötigt werden, sollten sie separat aufgeführt werden, weil

  • die Tabelle nachträglich erweitert werden könnte, die neue(n) Spalte(n) (im worst case ein BLOB!) nach der Abfrage aber nicht gebraucht werden

  • die Reihenfolge der Spalten bei der Ausgabe sonst undefiniert ist (bei den meisten Datenbanken ist es die Reihenfolge der Spaltendefinition bei der Anlage der Tabelle). Diese Reihenfolge könnte sich ändern (z.B. durch Einspielen eines Backups nach Erweiterung der Tabelle, durch eine neue Version des DBMS, etc.)

  • die Spalten sonst möglicherweise keinen vernünftigen oder eindeutigen Namen haben. Führt man die Spalten einzeln an, kann man mittels AS einen Namen (Alias) vergeben: SELECT p.pers_p_nr AS personalnummer FROM personal p ORDER BY personalnummer

  • dadurch im Script quasi automatisch dokumentiert wird, welche Spalten anschließend verarbeitet werden

Im MySQL-Manual wird in den Beispielen der Einfachheit halber fast immer SELECT * verwendet. Daran darf man sich jedoch für die Praxis kein Beispiel nehmen, sagt auch das Handbuch explizit - Zitat: "You should NEVER, in an application, use SELECT * and retrieve the columns based on their position, because the order in which columns are returned CANNOT be guaranteed over time; A simple change to your database may cause your application to fail rather dramatically."

Auch für INSERT gilt: immer alle Spaltennamen angeben! Statt INSERT INTO tabelle VALUES (1, 2, 3) ist also INSERT INTO tabelle (spalte1, spalte2, spalte3) VALUES (1, 2, 3) zu schreiben.

hosted by
schlund + partner

Valid HTML 4.01! Valid CSS!

16.14. Warum soll ich nicht SELECT * schreiben?
http://www.dclp-faq.de/q/q-sql-select.html
de.comp.lang.php FAQ | (c) Copyright 2000-2003 Das dclp-FAQ-Team