Ausführungsgeschwindigkeit

07/12/2008 - 15:49 von achim ehlers | Report spam
Hallo NG,

Um die Ausführungsdauer von Prozeduren, die regelmàßig angestossen werden,
zu verfolgen,
werden diese bei jeder Ausführung protokolliert.

immer wieder beobachte ich daß (einige wenige) Stored Prozeduren und auch
einige views,
eine extrem unregelmàßige Ausführungsdauer aufweisen.

Beispiel:
Folgender select

select tp.reffr, max(pr.nhm) nhm
, left(ltrim(rtrim(max(pr.ProdBez1))),32) produkt
, wa.wagen, sum(nettogew) gewicht
into #tmp1
from iftman..tbl_transport tp with (nolock)
left join iftman..tbl_produkt pr with (nolock) on tp.isid = pr.isid
left join iftman..tbl_wagen wa with (nolock) on pr.isid + cast(pr.num5
as char(6)) = wa.isid + cast(wa.num5 as char(6))
where nachrdat > getdate() - 3 and len(reffr) = 17 and reffr !=
'00190001010000000' and left(reffr,4) != 'UKL'
group by tp.reffr, wa.wagen

làuft über einige Tage innerhalb von wenigen Sekunden und benötigt dann
plötzlich ohne erkennbaren Grund bis zu 10 Minuten
dann einige Tage spàter geschieht von jetzt auf gleich, das umgekehrte.
Die Abfrage benötigt wieder 1- 6 Sekunden.
Das Datenvolumen in den Datenbanken ist immer in etwa das gleiche

soweit ich es bisher feststellen konnte liegt in diesem Fall die Bremse in
folgendem Teil
on pr.isid + cast(pr.num5 as char(6)) = wa.isid + cast(wa.num5 as
char(6))

wie kommt es aber zu solch extremen Zeitunterschieden und wie kann ich diese
zumindest in diesem Fall verhindern (umgehen)???


Protokoll der Ausführungnszeit und der Ausführungsdauer:

Prg Erfasdat dauer
Produkte_einrechnen 2008-12-07 00:47:56.170 156
Produkte_einrechnen 2008-12-07 00:32:57.757 156
Produkte_einrechnen 2008-12-07 00:22:22.243 171
Produkte_einrechnen 2008-12-07 00:00:32.207 6
Produkte_einrechnen 2008-12-06 23:45:22.133 2
Produkte_einrechnen 2008-12-06 23:30:22.247 2
...
dauerhaft schnell
...
Produkte_einrechnen 2008-12-04 11:45:22.003 0
Produkte_einrechnen 2008-12-04 11:30:30.103 1
Produkte_einrechnen 2008-12-04 11:15:42.343 1
Produkte_einrechnen 2008-12-04 11:03:53.190 208
Produkte_einrechnen 2008-12-04 10:48:54.057 190
Produkte_einrechnen 2008-12-04 10:36:22.300 188
...
dauerhaft langsam
...
Produkte_einrechnen 2008-11-23 00:48:18.000 177
Produkte_einrechnen 2008-11-23 00:33:19.537 179
Produkte_einrechnen 2008-11-23 00:23:44.337 189
Produkte_einrechnen 2008-11-23 00:00:30.643 7
Produkte_einrechnen 2008-11-22 23:45:21.727 1
Produkte_einrechnen 2008-11-22 23:30:21.733 1
...
dauerhaft schnell
...
Produkte_einrechnen 2008-11-14 18:45:34.460 2
Produkte_einrechnen 2008-11-14 18:33:16.780 4
Produkte_einrechnen 2008-11-14 18:16:57.643 9
Produkte_einrechnen 2008-11-14 18:04:06.650 172
Produkte_einrechnen 2008-11-14 17:48:18.627 164
Produkte_einrechnen 2008-11-14 17:34:39.120 258
...
dauerhaft langsan
...
Produkte_einrechnen 2008-11-03 08:46:45.193 81
Produkte_einrechnen 2008-11-03 08:31:58.560 81
Produkte_einrechnen 2008-11-03 08:17:11.740 80
Produkte_einrechnen 2008-11-03 08:01:39.607 3
Produkte_einrechnen 2008-11-03 07:45:26.443 1
Produkte_einrechnen 2008-11-03 07:30:33.790 0

Vielen Dank für eure Tipps


Gruß
A. Ehlers
 

Lesen sie die antworten

#1 Elmar Boye
07/12/2008 - 23:41 | Warnen spam
Hallo Achim,

"achim ehlers" schrieb ...
Beispiel:
Folgender select

select tp.reffr, max(pr.nhm) nhm
, left(ltrim(rtrim(max(pr.ProdBez1))),32) produkt
, wa.wagen, sum(nettogew) gewicht
into #tmp1
from iftman..tbl_transport tp with (nolock)
left join iftman..tbl_produkt pr with (nolock) on tp.isid = pr.isid
left join iftman..tbl_wagen wa with (nolock) on pr.isid + cast(pr.num5 as char(6)) = wa.isid + cast(wa.num5 as char(6))
where nachrdat > getdate() - 3 and len(reffr) = 17 and reffr != '00190001010000000' and left(reffr,4) != 'UKL'
group by tp.reffr, wa.wagen

làuft über einige Tage innerhalb von wenigen Sekunden und benötigt dann plötzlich ohne erkennbaren Grund bis zu 10 Minuten dann
einige Tage spàter geschieht von jetzt auf gleich, das umgekehrte.



Das könnte an veralteten Statistiken liegen bzw. an größeren
Ausreissern bei den Werten, wodurch es zu einem ineffizenten
Plan kommt. Der wiederum solange genutzt wird, bis eine
wesentliche Änderung eintritt (oder der Plan anderweitig
aus dem Cache fliegt).

Führe die Abfrage jeweils mal mit Ausführungsplan aus
wàhrend sie schnell bzw. langsam ist .

soweit ich es bisher feststellen konnte liegt in diesem Fall die Bremse in folgendem Teil
on pr.isid + cast(pr.num5 as char(6)) = wa.isid + cast(wa.num5 as char(6))



Hier sollte auch ein Ausdruck wie

ON pr.isid = wa.isid AND pr.num5 = wa.num5

verwendet werden können.
Voraussetzung: Die isid und num5 Spalten haben jeweils den
gleichen Datentyp und Wertebereich.
Damit sollte eine zuverlàssigere Indexnutzung möglich sein.

Gruß Elmar

Ähnliche fragen