PDA

View Full Version : fetch first (vor Where)???



Seiten : [1] 2 3

svt
26-09-11, 08:13
Hallo,

ich bin noch ein Anfänger und habe folgende Frage:
Ich habe eine Tabelle die täglich enorm wächst, bis jetzt habe ich diese ganz
nomal abgefragt mit:

Select...
Where...
Order By....
diese Abfrage dauert aber mitlerweile ca. 10-15min, deswegen jetzt die Idee, nur mit den letzen 500 Datensätzen zu
arbeiten (die auch nur für mich interresant sind).
Wie kann man das am besten und vorallem Performen-schonensten lösen??

Danke
svt

S.Neinawaie
26-09-11, 08:25
Hallo!

Du könntest die Sortierung ändern (so dass die letzten Datensätze am Anfang stehen) und anschließend mit
"fetch first 500 rows only" arbeiten.

Select * from ....
Where ...
Order by ...
fetch first 500 rows only

Allerdings würde mich mal interessieren wieviele Milliarden Datensätze denn in dieser Tabelle liegen wenn eine Abfrage 10-15 Minuten dauert.

LG,
Sam

svt
26-09-11, 08:39
Hallo Sam,

habe ich auch schon probiert, bekomme
aber die Fehlermeldung:

"SQL-Status: 42601
Vendorencode: -199
Nachricht: [SQL0199] Schlüsselwort WHERE nicht erwartet. Gültige Token: <ENDE DER ANWEISUNG>. Ursache . . . . : Schlüsselwort WHERE wurde an dieser Stelle nicht erwartet."

Gruß
svt

S.Neinawaie
26-09-11, 08:49
Hallo!

Könntest du eventuell das SQL Statement hier posten?

LG,
Sam

svt
26-09-11, 09:14
Hallo Sam,
(sorry bin noch neu!!)
habe ich auch schon probiert, bekomme
aber die Fehlermeldung:

"SQL-Status: 42601
Vendorencode: -199
Nachricht: [SQL0199] Schlüsselwort WHERE nicht erwartet. Gültige Token: <ENDE DER ANWEISUNG>. Ursache . . . . : Schlüsselwort WHERE wurde an dieser Stelle nicht erwartet."

Gruß
svt

T.Dahl
26-09-11, 09:25
Könntest du bitte einmal deine SQL abfrage posten.
Sonst können wird leider nichts mit der Fehlermeldung anfangen.

LG
Tobi

B.Hauser
26-09-11, 09:43
Fetch 500 Rows only wird wahrscheinlich auch nicht helfen, sofern ein Zugriffspfad, der anders als die Order By-Anweisung geschlüsselt ist verwendet wird.

Das oberste Ziel des Optimizers ist so schnell wie möglich an die gewünschten Daten zu kommen und da werden die Where-Bedingungen vorrangig geprüft und erst anschließend die Order By-Anweisungen. Die Daten werden also sehr oft in temporären Objekten gespeichert und erst anschließend sortiert.

Wird also zusätzlich ein Fetch For 500 Rows angegeben, läuft zunächst die komplette Abfrage durch und aus dem kompletten Ergebnis werden dann die ersten 500 Sätze ausgegeben.

Die kannst die Abfrage nur dadurch beschleunigen, dass Du die Abfrage analysierst (z.B. mit STRDBG oder Visual Explain) und die optimalen Zugriffswege anlegst.

Birgitta

svt
26-09-11, 09:44
Hallo Tobi,

anbei das SQL:
SELECT TPANR1, TPNBHF, TPBENR, TPIDEN, TPKMEN, TPVORT, TPVREG, TPVHOR, TPVVER, TPBMEN

FROM brkdatv6.phisttp

fetch first 500 rows only


WHERE tpkonz='LCV' And TPVART='PAZ' And TPNBHF='PACKSTUBE'

ORDER BY TPANR1 DESC , TPBENR, TPZUNR, TPTIA, TPPALN, TPANRP



Gruß
svt

S.Neinawaie
26-09-11, 09:47
Hallo Tobi,

anbei das SQL:
SELECT TPANR1, TPNBHF, TPBENR, TPIDEN, TPKMEN, TPVORT, TPVREG, TPVHOR, TPVVER, TPBMEN

FROM brkdatv6.phisttp

WHERE tpkonz='LCV' And TPVART='PAZ' And TPNBHF='PACKSTUBE'

ORDER BY TPANR1 DESC , TPBENR, TPZUNR, TPTIA, TPPALN, TPANRP

fetch first 500 rows only

Gruß
svt

Damit sollte es funktionieren.

Allerdings wird das laut Fr. Hauser auch nicht den gewünschten Erfolg bringen. Ich würd mich an Ihre Hinweise halten. (Hab ich auch wieder neues gelernt - Danke Birgitta)

LG,
Sam

svt
26-09-11, 10:05
Hallo Birgitta,

kannst du mir beim Umbauen des SQl helfen, da relativ Neuland für mich!!!

Danke svt