Ergebnis 1 bis 1 von 1

Thema: Warum man kein SELECT * FROM ... verwenden sollte

  1. #1
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard Warum man kein SELECT * FROM ... verwenden sollte

    Immer wieder liest man, ein simples SELECT * FROM ... sei böse und soll nicht verwendet werden. Doch warum ist das so?

    1. Eine detaillierte Auflistung aller zu selektierenden Spalten ist faktisch gleichzeitig eine Dokumentation dessen, was der SELECT-Befehl zu liefern hat

    2. 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 *

    3. kann der Planner besser planen, was genau zu tun ist.

    4. 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

    5. 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:

    Code:
    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
    Geändert von Xandrian (28.03.2010 um 17:05 Uhr)
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum