-
Nachtrag:
der fetch im Rpg, aufgelöst als call sql...
braucht sowohl beim fetch first als auch beim den weiteren fetch next endlos lange
daher vermute ich, das auch ein optimize for 1 row nix hilft
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Éin kalkulierter Index hilft leider nicht wenn die Abfrage nicht auf "=" lautet.
Wenn du nicht mit "%xx%" arbeitest, kannst du ggf. den Index verwenden, wenn du auf
upper(Name) between VonName and BisName
abfragst.
VonName = 'JOK';
BisName = 'JOK' + *hival;
Aber auch hier gibts keine Garantie.
Hast du den "Optimize for" denn mal versucht?
-
 Zitat von Robi
Nachtrag:
der fetch im Rpg, aufgelöst als call sql...
braucht sowohl beim fetch first als auch beim den weiteren fetch next endlos lange
daher vermute ich, das auch ein optimize for 1 row nix hilft
... hast Du da eine stored procedure mit Resultset gemacht? Schmeiß den Penner raus, das führt, ähnlich wie UDTFs zu einem optimize for all rows, der einen Hang zum full table scan hat - je mehr Tabellen gejoined werden, umso mehr tendiert das (fatalerweise) zum full table scan.
Wenn Du sicher bist, dass das resultiernde ResultSet klein ist, kannst Du auch versuchen in der stored procedure die hohen Selektivitäten vorzuziehen und temp tables zu verjoinen.
D*B
-
@D*B
Nee, nix Stored Procedure
Das Sql wird doch vom Compiler umgewandelt in einen call.
Und dieser call, der den 1. Fetch (fetch first from cursor01 into :f1, F2, ...)
dauert schon endlos.
@Baldur
ok, versuche mal auf between um zu stellen
Optimize n.n. versucht. mach ich auch gleich mal ...
anderer Test, 2 Selektions Kriterien, < 1 Sekunde interaktives sql, 2 Minuten 34 Sekunden SQLRPGLE.
Robi
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
 Zitat von Robi
@D*B
Nee, nix Stored Procedure
Das Sql wird doch vom Compiler umgewandelt in einen call.
Und dieser call, der den 1. Fetch (fetch first from cursor01 into :f1, F2, ...)
dauert schon endlos.
Robi
... aus dem interaktiven SQL erfolgt hier auch nicht viel was anderes. Die lange Dauer für den ersten fetch könnte eben gerade auf einen full table scan hindeuten.
Die join order könnte man über die QAQQINI forcieren, würde ich aber normal nicht empfehlen. In jedem Fall würde ich einen order by machen, falls keiner da ist, das kann den Query Optimizer auch in eine Richtung schieben.
D*B
-
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
-
Wobei ich diesem "Optimize for" nicht soi ganz traue, da ich trotz vieler Versuche selten einen Effekt erzielen konnte.
-
@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!
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
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
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
ersteres erlaubt keine temporäre Kopie, was den Geschwindigkeitsunterschied erklärt.
D*B
-
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...
-
Ich glaube da ist nur die Umsetzung des Compilers in eine "CALL SQLROUTE"-Anweisung gemeint.
Ohne den DB-Monitor wirst du da wohl nicht rumkommen.
Probier doch mal den "optimize for 1 rows" erst mal aus.
Similar Threads
-
By malzusrex in forum NEWSboard Programmierung
Antworten: 5
Letzter Beitrag: 09-06-16, 11:36
-
By KingofKning in forum IBM i Hauptforum
Antworten: 11
Letzter Beitrag: 28-06-15, 00:32
-
By Toschie in forum IBM i Hauptforum
Antworten: 12
Letzter Beitrag: 02-02-15, 14:28
-
By Bernstein in forum NEWSboard Server Job
Antworten: 0
Letzter Beitrag: 05-08-14, 17:34
-
By Günther in forum IBM i Hauptforum
Antworten: 7
Letzter Beitrag: 20-03-03, 13:51
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks