View Full Version : LF / SQL index
Ich mache doch einen SQL und wähle feld a ,b,c von der physischen. Normal müsste doch der optimizer hergehen und sagen , hey cool ich da eine LF die genauso aufgebaut ist. ... Felder und Reihgenfolge passen mit dem Vorschlag des Advisors überein . Habs nochmal überprüft.
Sie mal mit DSPFFD nach, welche Felder die logische Datei tatsächlich besitzt. ;)
Ergänze mal ein ORDER BY A, B, C in deinem SELECT, wenn du die Daten sortiert benötigst.
Frage: Die logische Datei mit der SELECT/OMIT-Anweisung, hat diese die gleichen (oder mehr) Schlüsselfelder in der gleichen Reihenfolge wie die neue logische Datei?
Wenn ja, wird für beide Dateien der gleiche Zugriffsweg verwendet (Access Path Sharing).
Wenn Du die loglische mit SELECt/OMIT löschst und wieder neu erstellst, sollte zwar auch der gleiche Access Path verwendet werden, aber jetzt zeigt er auf die neue logische und die SELECT/OMIT-Warnung sollte nicht mehr auftauchen.
Birgitta
woodstock99
05-03-15, 18:37
hallo zusammen ,
also ich hab heute den halben Tag rumgespieltund erreicht hab ich nix .
@Fuerchau . hab die LF mit Schlüsselfelder gelöscht und den create Index benützt. Ergebnis -Flasche Datei benützt . ABER er bringt jetzt die Meldung 4 - Also die kosten für die Benützung der Datei sind zu hoch . Das ist der Hit :).
@Pickachu . die Felder passen :). Order by etc ergebnis - Siehe Fuerchau .
@Birgitta. Nein die Felder sind nicht gleich deshalb kapier ich es ja nicht .
Wie gesagt der Hit ist ja der Advisor bringt immer wieder die logische Datei die ich neu erstellt habe als Vorschlag und er zählt auch fleissig die Times Adviced hoch aber nehmen tut er sie nicht obwohl Sie auf dem System ist .
ICH BIN SCHEINBAR ZU DOOF für diese Datei . Alle anderen klappen .
Kann es sein das zuviele logische drauf sind ? Ich trau es mir kaum sagen aber die Physische Datei hat über 50 logische :eek::confused:(Ich hab das nicht verbrochen :)) NEIN NEIN NEIN :) .
Aber dann würde er ja nicht die Meldung 4 bringen mit zu hohen kosten .
Ich forsche da mal weiter bis es klappt . Parole niemals aufgeben oder getreu nach dem Motto :o Herr vergib ihnen denn sie wissen nicht was sie tun :D
PS: die logische bezieht sich auf die richtige Physische .....
Zu letztem Kommentar: ohne dem würde die LF in der Liste ja nicht auftauchen.
Ich habe dies auch oft genug erlebt, dass die Vorschläge von der Laufzeit dann nicht genommen werden.
Es wohl so, dass hier 2 IBM-Entwicklergruppen für das Thema zuständig sind so dass das Ergebnis nicht festgelegt werden kann.
Man liest ja immer wieder, das SQL intern den SQL schon mal umbaut. Ich vermute, dass die Indexfindung vor dem Umbau stattfindet und nach dem Umbau der Vorschlag gebracht wird.
Da kommen schon mal Konstrukte wie Index F1/F2 kostet zu viel, bitte mach einen Index F2/F1 und das bei einer Abfrage "... where F1 = X and F2 = Y", ein Drehen der Schlüsselvollkommen sinnlos ist.
Ich hatte mal für eine Anwendung alle SQL's auf V5R4 optimiert. Bei V6R1 liefen sie auch noch performant. Nun bei V7R1 muss ich fast alle SQL's noch mal analysieren da sie nicht mehr performant sind.
Warum die IBM so einen Mist abliefert frage ich mich wirklich.
Gut, einen Vorteil hat das noch, ich werde noch nicht so schnell arbeitslos:).
Ich hatte mal für eine Anwendung alle SQL's auf V5R4 optimiert. Bei V6R1 liefen sie auch noch performant. Nun bei V7R1 muss ich fast alle SQL's noch mal analysieren da sie nicht mehr performant sind.
Dieser Ansatz, SQL Statements so umzubauen, dass sie mit dem vorhandenen Datenbank- und Indexdesign schnell sind, ist Teil des Problems. Die Optimierungen müssen vorrangig am Indexdesign, dann am Datenbankdesign und zuletzt - wenn überhaupt - an der Formulierung bestimmter SQL Statements vorgenommen werden. Wenn zwei verschiedene Beschreibungen derselben Ergebnismenge unterschiedlich schnell ausgeführt werden, dann ist das eher ein Bug als ein Feature der Query Engine - mit der einzigen Ausnahme des optimizing for n rows, das ja die Optimierungsstrategie des Optimizers anspricht. Wenn dann ein Statement auf einen solchen blinden Fleck des Optimizers ausgerichtet wird, dann ist es nur logisch, dass das dann kippt und schlechter wird, wenn der Optimizer besser wird. Chaotisch wurde es dann, als man auf einmal zwei Optimizer hatte, die sich gegenseitig ins Handwerk gepfuscht haben, am Besten hätte man diese Releases komplett übersprungen, wenn man auf SQL setzte.
Ein ähnliches Problem organisiert man sich, wenn man SQL und RLA nebeneinander benutzt, spätestens wenn man bei dem wilden Mix von SQL DDL und DDS landet, der ja sogar von einigen propagiert wird, dann fallen bei der Neuerstellung eines LFs oder eines Index auf einmal ganze Kartenhäuser zusammen, weil das Access path sharing, eine DDS/RLA Altlast, dazu führen kann, dass ein bestimmter Access Path (und den schlägt die QUery engine eigentlich vor) garnicht erstellt wird, wenn man den geforderten Index (nur den kann man erstellen) anlegt. Da braucht man keinen Durcheinander mit CCSIDs und Text-Schlüsselfelder mehr, wenn man den Query Optimizer nicht mehr verstehen will...
D*B
Wie sieht denn der SELECT genau aus?
@Dieter
Ich habe meine SQL's nur unwesentlich angepasst sondern halt die benötigten damals vorgeschlagenen Indizes angelegt.
Stand V7R1 ist es nun, dass diese Indizes z.T. nicht mehr verwendet werden und die SQL's deshalb ineffektiv sind. Ggf. hat dies nun damit zu tun, dass die CQE nicht mehr verwendet wird (die meisten Tabellen sind eben noch DDS) und nun die SQE anders optimiert.
Das ist nun einfach blöd und muss man akzeptieren.
Nicht akzeptieren muss man allerdings die geänderten Autocast-Funktionen die zu komplett anderem Verhalten führen bis hin zu falscher Auswahl oder plötzlichen negativen SQLCODE's oder gar positiven SQLCODE's.
Hängt die logische auch wirklich an der physischen Datei dran (DSPDBR)?
Aber ohne den echten Aufbau der logischen und physischen Datei und der Abfrage zu kennen, kann man leider nur raten ...
hm, ich verwende bei LFs idR alle Felder und definiere ausschließlich die Keys, also z.B. so
A R FILEL1 PFILE(FILE)
*
A K FELDA
A K FELDB
A K FELDC
*
Keine sonstigen Felddefinitionen und keine Select/Omits.
Mit diesen hatte ich nie ein Problem, dass SQL die nicht verwendet.
Dies ist auch korrekt so, anders funktioniert ein CREATE INDEX auch nicht.
Allerdings kann man nun auch berechnetet Indizes erstellen die dann auch verwendet werden, wenn die Where-Klausel den Ausdruck auch wiederholt. Ist der Ausdruck nicht identisch kann der Index nicht verwendet werden. Daher kann SQL nun auch die Omit/Select's verwenden.
Aber wer denkt schon daran, seinen SQL an so einen Index anzupassen.
Wie viel 100e Indizes soll ich dann erstellen?
Von der Maintenance-Perfomance mal ganz abgesehen.