Anmelden

View Full Version : Performance sqlrpgle / strsql



Seiten : 1 [2]

B.Hauser
03-11-16, 15:34
Es gibt schon einen Unterschied zwischen STRSQL und statischem embedded SQL und zwar ist es das Optimierungsziel. Alle dynamsichen SQL-Statements (damit auch Abfragen aus STRSQL) werden per Default mit dem Optimierungsziel *FIRSTIO (der erste Datenblock muss so schnell wie möglich zurückgebracht werden). Statisches SQL wird per default mit Optimierungsziel *ALLIO optimiert, d.h. das komplette Ergenis muss so schnell wie möglich zurückgebracht werden.

Normalerweise hat das Optimierungsziel wenig Einfluss, kann aber genau in dem Moment wo sich der Optimizer zwischen Table Scan und halb-optimalem Index-Zugriff entscheidend sein.
Bei Dir ist genau diese Situation eingetreten.

Das Optimizerungsziel kann über die OPTIMIZE FOR X ROW-Anweisung beeinflusst weden.
Wird X durch eine kleine Zahl ersetzt, wird Optimierungsziel *FIRSTIO verwendet. Wird X durch eine sehr große Zahl oder ALL ersetzt wird Optimierungziel *ALLIO verwendet.

Birgitta

Fuerchau
03-11-16, 15:48
Wobei ich diesem "Optimize for" nicht soi ganz traue, da ich trotz vieler Versuche selten einen Effekt erzielen konnte.

Robi
03-11-16, 16:06
@D*B
alle fetch sind langsam, der erste ist definitiv nicht der 'schuldige'

@Baldur und Birgitta
also der optimize ist ja schnell eingebaut gewesen
for 9 rows keine Verbesserung
for 1 rows keine Verbesserung
das ist echt krank!

Ich glaube das ist eher langsamer geworden!

Robi
03-11-16, 16:48
Warscheinliche Ursache:
DECLARE C1 DYNAMIC SCROLL CURSOR FOR SE_FLD1

statt
DECLARE C1 SCROLL CURSOR FOR SE_FLD1

jetzt ist die performance ok

Danke Euch allen

Robi

BenderD
03-11-16, 17:13
ersteres erlaubt keine temporäre Kopie, was den Geschwindigkeitsunterschied erklärt.

D*B

Fuerchau
03-11-16, 17:17
Auch stellt sich die Frage, warum einen Scroll-Cursor.
Das kann man doch mittels Subfile besser lösen.

Aber schön, dass du es doch selber gefunden hast.
Im STRSQL->F13 gibts hierzu die EInstellung "Datenaktualisierung" und "Datenkopie".
Schau dir dann mal deine Abfrage mit *ALWAYS an...