hi Miro,
der Ablauf(stark vereinfacht):
1. *
- SELECT (deutlich kürzer)
- DB durchsucht die Tabellendefinitionen nach den Feldern und erzeugt eine Feldliste
- Parser parst
- Ergebis wird geliefert
2. Feldnamen
- SELECT (oft deutlich länger)
- DB prüft in der Tabellendefinitionen die Gültigkeit der Feldnamen
- Parser parst
- Ergebis wird geliefert
Die Frage ist: was ist schneller
- Query mit allen Felddefinitionen ergänzen
- Feldnamen prüfen
Bei verketteten Tabellen wird das natürlich noch schwieriger, weil ja oft Namenskollisionen auftreten, die irgendwie vom DB-System gehandelt werden müssen.
Das entsprechende Benchmarking ist ja leicht auszuführen.
Der wichtigste Punkt ist aber die Programmwartbarkeit.
Was passiert zum Beispiel, wenn ein anderer Entwickler noch Datenfelder hinzufügt oder entfernt oder die Positionen tauscht. An welcher Stelle tritt der Fehler auf. Mit * irgendwo im Programm, mit Feldnamen sofort bei der entsprechenden Query.
Was passiert, wenn ich Datenfelder hinzufüge, die evtl. in einem anderen Modul benötigt werden. Mit Feldnamen kein Problem, alle Namen sind genau definiert und werden genau so verarbeitet wie geplant.
Mit * geht der Zirkus los, alle Module dursuchen, Queries anpassen, Indizes ändern usw.(Man vergisst natürlich immer was und merkt's erst ein halbes Jahr später).
Im Sinne der Programmwartbarkeit ist es natürlich auch besser, wenn schon in der Query, die Feldnamen lesbar erscheinen, das hilft nach ein paar Monaten ungemein. Selbstverständlich sollte auch die Anweisung strukturiert niedergeschrieben werden.
Bsp:
SELECT
t1.id, t1,name,
t2.ort, t2.plz,
t3.abteilung, t3.gehalt,
AVG(t3.blabla)
FROM t1
JOIN t2
ON blabla
JOIN t3
ON blabla
WHERE blabla
GROUP BY blabla
ORDER BY blabla
wenn ich solche Abfragen im Programmcode habe, spare ich eine Menge Sucherei.
Verarbeitung der Resultate:
Es ist deutlich schneller, wenn die Resultate ausschließlich in einem indizierten Array geliefert werden, da ja mit der Query bereits die Reihenfolge definiert wurde. Das klappt nur ohne Stern.
Mit Stern ist man oft auf Hash Arrays angewiesen, was im allgemeinen mehr CPU benötigt als ein reines Indexarray.
Mit * bzw tab.* besteht außerdem immer die Möglichkeit, dass zu viele Datenfelder übertragen werden, besonders beim JOIN.
Am schlimmsten finde ich die Variante, beide Versionen gleichzeitig zu erstellen.
Tip:
Nimm Dir doch mal ein Benchmarking Tool und teste die div. Varianten durch. Du wirst Dich wundern, was da zu Tage kommt.
Grüße Oesi