Faust2011 schrieb:
@'cude: Ich habe in Richtung Kreuzprodukt gedacht. Durch Deine Darstellung finde ich die ganze Thema hier super aufbereitet.
Was man bei der Analyse von SQL-Statements nie vergessen sollte: der konkrete Ausführungsplan eines Datenbanksystems lässt sich nie im Voraus erschließen. Der kann immer anders sein, da er z. B. auch von den Indizes (bzw. deren Aktualität) abhängt.
Doch, tut es, sogar relativ einfach. Man muss lediglich die Selektivität kennen und das darausresultierende Größenverhältnis der Tabellen.
Indexes allein bringen rein gar nichts und was ist eine "Aktualität des Indexes"? Sowas, wie "Aktualität des Indexes" gibt es nicht, entweder ist das Ding da oder eben nicht.
Die Wichtigsten Parameter für den Ausführungsplan sind (reihenfolge ist irrelevant):
1. sind die Spalten, auf die gefiltert und gejoint wird, indexiert?
2. wie sehen die Histogramme aus
3. wie selektiv ist das Prädikat, mit dem in die Tabelle reingegriffen wird
4. kann eine Abfrage rein aus dem Index bedient werden oder muss zwingend auf die Tabelle zugegriffen werden (aus dem Beispiel mit Newsmeldungen: man kann einen Index erstellen, der autor_id und author beinhaltet, damit spart man sich den Tabellenzugriff)
5. wie ist das Größenverhältnis der Tabellen
6. ist der Optimizer eingestellt: first_rows vs. all_rows.
Faust2011 schrieb:
Auch der aktuelle Füllstand der Tabellen spielt eine Rolle.
Nein, tut es nicht, solange die Spalte über die reingegriffen wird, einen Index hat.
mental.dIseASe schrieb:
Was der Optimizer letztlich macht ist die eine Sache, aber ich finde es als Mensch schwer zu lesen und etwas kacke wartbar, wenn Joins als Filter geschrieben werden.
Schwer zu lesen? Also ich erkenne einen Filter und einen Join auf den ersten Blick. Und was soll daran "kacke wartbar"?
Ansi-SQL macht nur dann Sinn, wenn man versucht datenbankunabhängig (bzw. DB-übergreifend) zu entwickeln, aber das ist eh utopisch. Es gibt keinerlei Gründe bei Oracle Ansi-SQL zu verwenden. Es gibt nur einen UseCase, der mir so spontan einfällt, wo man mit Oracle-SQL nicht weiterkommt: ein zweifacher OUTER JOIN aus eine Tabelle.
mental.dIseASe schrieb:
Wir würden dafür auch was hinter die Löffel bekommen, wenn das bei uns einer macht.

Deswegen wird nur verkomma't, wenn das auch tatsächlich so gewollt ist, ansonsten so explizit wie möglich verjoint. DBMS ist bei uns übrigens auch Oracle.
Absoluter Schwachsinn, aber macht nur. Unsere Entwickler kriegen eins auf den Sack, wenn sie für IDs Integer nehmen und einer auf die Idee kommt Ansi-SQL zu hacken, wenn es nicht unbedingt (Beispiel von oben) notwendig ist. Wenn ich ein bestimmtes RDBMS habe, dann entwickle ich bitte auch genau für dieses.