View Full Version : Wann genau wird der Plan Cache gelöscht
dschroeder
13-09-12, 09:09
Vielen Dank für die Infos.
Ich mache es im Prinzip so, wie du es beschrieben hast: Nur aktuelle Vorschläge werden überhaupt in Erwägung gezogen. Ich schaue mir natürlich auch an, wie oft der Index angefordert wird und weshalb (war es ein normaler User oder hat ein Programmierer einfach mit SQL "rumprobiert"). Die Sache mit der Analyse der SQL-Statements ist natürlich schwierig. Einige Abfragen werden mit dynamischem SQL zusammengebaut und sehen abhängig davon, was die User selektieren, immer wieder anders aus. Außerdem haben wir einiges über user defined functions gekapselt. Da läuft dann innen eine Mischung aus RPG und embedded sql.
Gruß,
Dieter
Eine Selektion über UDF "... where myudf(..) = xxx" erzwingt natürlich einen Tablescan.
Hier ist ggf. aber zu prüfen ob das nicht anders gelöst werden kann oder zusätzlich Felder zur Abfrage verwendet werden können.
UDF's in der Where-Klausel gehörten aus Performancesicht auch verboten.
dschroeder
13-09-12, 11:32
Wir verwenden UDFs in der Regel nicht im Where bzw. dann nur, wenn weitere Selektionsbedingungen vorhanden sind, mit denen der Optimizer die Grundmenge schon mal verkleinern kann. (Ich hoffe, dass der Optimizer das auch tut, dass er also die UDF erst zum Schluss prüft).
Sorry: Eben habe ich mich auch verschrieben. Ich meinte nicht, dass wir UDFs für die Selektion nutzen, sondern UDTFs.
Danke für die Infos,
Dieter
Sorry: Eben habe ich mich auch verschrieben. Ich meinte nicht, dass wir UDFs für die Selektion nutzen, sondern UDTFs.
Wirklich UDTFs?
Die können nämlich nur in der From-Anweisung verwendet werden.
Ansonsten schau Dir die Analyse-Tools im System iNavigator an. Da siehst Du auch welches SQL Statement ausgeführt wurde (unabhängig davon, ob es dynamisch oder als statisches SQL oder als ad hoc-Abfrage ausgeführt wurde.)
Die Analyse-Tools ermöglichen Dir auch die SQL-Statements wieder "herzuholen" und erneut auszuführen etc.
Ansonsten solltest Du einfach mal den systemweiten Index-Advisor (die Datei SYSIXADV) clearen und nach einiger Zeit, z.B. 1, 2 Wochen die die neuen Advices anschauen.
Sofern die Advices von der SQE ausgesprochen wurden, und solange kein IPL gefahren wurde, kannst Du Dir auch die SQL-Statements, die zu dem Advice geführt haben anzeigen lassen.
... ich komm' auch gerne mal zur weiteren Unterstützung vorbei ;)
Birgitta
dschroeder
13-09-12, 13:56
Hallo Birgitta,
vielen Dank für die Anmerkungen. Die UDTFs benutzen wir in der Tat für Selektionen. Natürlich kommen sie nicht in der where Klausel vor. Wir haben beispielsweise eine UDTF, der man einige Suchbegriffe übergeben kann und die einem dann die gefundenen Kunden zurückgibt. Wir machen das so, damit bestimmte aufwendigen Codierungen (wie z.B. Berechtigungsprüfung) gekapselt ist. Wenn jeder Programmierer die UDTF verwendet, um die Kunden zu lesen, kann er sicher sein, dass nur die erlaubten Kunden ermittelt werden. Wenn er mit SQL einfach selber auf die Kundentabelle geht, muss er selber daran denken, die Berechtigungsprüfung aufzurufen. Und so eine UDTF können wir eben nicht nur von der iSeries-Programmierung aus nutzen. Auch unsere Java-Kollegen oder unsere Kollegen, die ad hoc Auswertungen machen, können das nutzen.
Wir nutzen SQL (dank deiner hervorragenden Schulungen bei uns) immer stärken. Neue Sachen machen wir fast nur noch mit SQL. Deshalb wird es bei uns immer wichtiger, sich auch um die Performance bei SQL-Zugriffen Gedanken zu machen. Wir haben da aktuell noch eine Anfrage bei IBM offen. Wir müssen mal schauen, was dabei herauskommt. Wenn wir da nicht weiterkommen, sollten wir nochmal über einen Inhouse-Termin sprechen.
Gruß,
Dieter