Jürgen Auer
Legendäres Mitglied
Vor ein paar Tagen hatte ich mir mal gesagt, ich müsse mal endlich in Server-Daten eine Funktion einbauen, die mir lang laufende Abfragen direkt meldet.
Nicht auf jede Abfrage, bsp. lohnt sich das nicht bei Abfragen, die einzelne Zeilen holen. Ebenso lohnt es sich üblicherweise nicht bei einigen typischen Suchabfragen und beim Holen von Auswahllisten.
Aber es gibt einen Aufruf, der alle 'richtigen Suchen' in einer Seite zusammenfaßt - und alles, was da über 0,1 Sekunden ist, soll mal gemeldet werden.
Im Alltag werde ich den Wert hochsetzen - aber so am Wochenende ist das mal ganz interessant.
Das heute mittag eingebaut, technisch ist das ein banaler Timer.
Prompt eine 'Uralt-Abfrage' bei einem Kunden entdeckt. Eigentlich mit 0,28 Sekunden noch harmlos, die gesamte Seite war in 0,5 Sekunden geladen. Trotzdem natürlich die Neugier: Läßt sich das beschleunigen?
Die Logik ist eigentlich ziemlich simpel:
QUOTE Select A.Id,
'Textkonstante' As Basis,
A.Bezeichnung_soft + '.' + Cast(A.ID as nvarchar(15)) As Bezeichnung_soft,
'/' As Trenner_1,
B.Aufrufname_soft + '.' + Cast(B.andereId as nvarchar(15)) As Aufrufname_soft,
'TextKonstante' + A.Bezeichnung_soft + '.' + Cast(A.Id as nvarchar(15)) + '/' + B.Aufrufname_soft + '.' + Cast(B.andereId as nvarchar(15)) + ''' ' +
Case When A.neues_Fenster = 1 Then ' target=''_new''' Else '' End +
Case When A.nofollow = 1 Then ' rel=''nofollow''' Else '' End +
Case When A.Titel Is Null Then '' Else ' title=''' + A.Titel + '''' End As Ergebnis_long
From ersteTabelle As A, zweiteTabelle As B
Where ... noch ein paar mögliche Filter per Parameter, die auch Null sein können
Order By Ergebnis_long
Also hier eine absichtliche Komma-Verknüpfung zweier Tabellen, weil jede Zeile mit jeder anderen Zeile kombiniert werden soll (normalerweise bevorzuge ich dezidierte Join-Anweisungen). Dann ein zusammengestrickter langer String, nach dem sortiert wird. Technisch sollen da Links zusammengestrickt werden, die sich nun leicht per Copy+Paste anderswo einfügen lassen.
Ok, das ganze wird nochmals maskiert, in eine Unterabfrage gepackt - aber das war nicht das Problem.
Wie läßt sich die Abfrage dramatisch beschleunigen?
PS: Das Beispiel zeigt schön, wie man - durchaus 'gedankenlos' - schnell eine Abfrage runtertippt, diese funktioniert auch - und erst sehr viel später merkt man, daß das ja auch ganz anders gehen könnte.
Nicht auf jede Abfrage, bsp. lohnt sich das nicht bei Abfragen, die einzelne Zeilen holen. Ebenso lohnt es sich üblicherweise nicht bei einigen typischen Suchabfragen und beim Holen von Auswahllisten.
Aber es gibt einen Aufruf, der alle 'richtigen Suchen' in einer Seite zusammenfaßt - und alles, was da über 0,1 Sekunden ist, soll mal gemeldet werden.
Im Alltag werde ich den Wert hochsetzen - aber so am Wochenende ist das mal ganz interessant.
Das heute mittag eingebaut, technisch ist das ein banaler Timer.
Prompt eine 'Uralt-Abfrage' bei einem Kunden entdeckt. Eigentlich mit 0,28 Sekunden noch harmlos, die gesamte Seite war in 0,5 Sekunden geladen. Trotzdem natürlich die Neugier: Läßt sich das beschleunigen?
Die Logik ist eigentlich ziemlich simpel:
QUOTE Select A.Id,
'Textkonstante' As Basis,
A.Bezeichnung_soft + '.' + Cast(A.ID as nvarchar(15)) As Bezeichnung_soft,
'/' As Trenner_1,
B.Aufrufname_soft + '.' + Cast(B.andereId as nvarchar(15)) As Aufrufname_soft,
'TextKonstante' + A.Bezeichnung_soft + '.' + Cast(A.Id as nvarchar(15)) + '/' + B.Aufrufname_soft + '.' + Cast(B.andereId as nvarchar(15)) + ''' ' +
Case When A.neues_Fenster = 1 Then ' target=''_new''' Else '' End +
Case When A.nofollow = 1 Then ' rel=''nofollow''' Else '' End +
Case When A.Titel Is Null Then '' Else ' title=''' + A.Titel + '''' End As Ergebnis_long
From ersteTabelle As A, zweiteTabelle As B
Where ... noch ein paar mögliche Filter per Parameter, die auch Null sein können
Order By Ergebnis_long
Also hier eine absichtliche Komma-Verknüpfung zweier Tabellen, weil jede Zeile mit jeder anderen Zeile kombiniert werden soll (normalerweise bevorzuge ich dezidierte Join-Anweisungen). Dann ein zusammengestrickter langer String, nach dem sortiert wird. Technisch sollen da Links zusammengestrickt werden, die sich nun leicht per Copy+Paste anderswo einfügen lassen.
Ok, das ganze wird nochmals maskiert, in eine Unterabfrage gepackt - aber das war nicht das Problem.
Wie läßt sich die Abfrage dramatisch beschleunigen?
PS: Das Beispiel zeigt schön, wie man - durchaus 'gedankenlos' - schnell eine Abfrage runtertippt, diese funktioniert auch - und erst sehr viel später merkt man, daß das ja auch ganz anders gehen könnte.