Ik heb een Stored Procedure gemaakt die an sich wel doet wat hij moet doen, maar hij is nogal traag en hij vergt wat acties aan de client kant om de gewenste data te verkrijgen.
De functie van deze tabellen is het bijhouden wanneer een applicatie is gestart en wanneer hij is gestopt (tblAppStatus), de tblLog tabel vergaart alle log informatie van een applicatie, maar ook van componenten die door applicaties worden gedaan. Als een component onder een applicatie hangt en een logregel wegschrijft, neemt hij het AppStatusID van de moeder applicatie over. Zo kan ik een compleet beeld krijgen van een run van een applicatie.
De problemen met snelheid doen zich nu voor met het tonen van tblAppStatus records met daarbij de waarden van ID1 t/m 4 uit de logtabel.
De tabelstructuur (vereenvoudigde versie)
Ik wil dus uit deze data een lijst maken met alle appstatusrecords en de gevulde waarde van ID1 t/m ID4 uit de logtabel. Het nadeel is dat die ID-velden niet overal gevuld zijn.
De Querydie ik nu heb:
Ik kan dus zoeken op ID1,ID2,ID3,ID4, AppStatusid en LogTime.
Het resultaat dat ik hier uit krijg zijn alle regels waar de dubbele regels gegroepeerd zijn. Ik wil dus hebben dat hij ze op AppStatusID groepeerd en zorgt dat als in die groepering ergens een veld ID1 gevuld is dat die getoond wordt. Zo ook voor ID2, ID3 en ID4. Dit laatste doe ik nu Clientside en dat kan niet de bedoeling zijn.
Ik heb al een werkende versie gehad met subselects, maar die was zo ongelooflijk traag dat het niet werkbaar was.
Welke kant moet ik opzoeken?!
PS: Qua indexen kan ik helaas niets winnen, aangezien die het wegschrijven van logregels zouden vertragen (dat gebeurt namelijk nogal vaak).
De functie van deze tabellen is het bijhouden wanneer een applicatie is gestart en wanneer hij is gestopt (tblAppStatus), de tblLog tabel vergaart alle log informatie van een applicatie, maar ook van componenten die door applicaties worden gedaan. Als een component onder een applicatie hangt en een logregel wegschrijft, neemt hij het AppStatusID van de moeder applicatie over. Zo kan ik een compleet beeld krijgen van een run van een applicatie.
De problemen met snelheid doen zich nu voor met het tonen van tblAppStatus records met daarbij de waarden van ID1 t/m 4 uit de logtabel.
De tabelstructuur (vereenvoudigde versie)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| Tabel tblAppStatus ------------------------ AppStatusId StartTime EndTime Source Tabel tblLog ------------------------ LogId AppStatusId LogTime Source ID1 ID2 ID3 ID4 |
Ik wil dus uit deze data een lijst maken met alle appstatusrecords en de gevulde waarde van ID1 t/m ID4 uit de logtabel. Het nadeel is dat die ID-velden niet overal gevuld zijn.
De Querydie ik nu heb:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| SELECT
tAs.AppStatusId,
tAs.starttime,
tAs.endtime,
tAs.Source,
tAS.Status,
tL.ID1,
tL.ID2,
tL.ID3,
tL.ID4
FROM tblAppStatus tAS
INNER Join tblLog tL on tAS.AppStatusId=tL.AppStatusId
GROUP BY tAs.AppStatusId,tAS.Source,tAs.starttime,tAs.endtime,tAs.Status,tL.ID1, tL.ID2, tL.ID3, tL.ID4
HAVING ((tAS.Source = @Source) Or (@Source is null))
AND ((tL.ID1 = @ID1) Or (@ID1 is null))
AND ((tL.ID2 = @ID2) Or (@ID2 is null))
AND ((tL.ID3 = @ID3) Or (@ID3 is null))
AND ((tL.ID4 = @ID4) Or (@ID4 is null))
AND ((tL.AppStatusId = @AppStatusId) Or (@AppStatusId is null))
AND ((tAS.status = @AppStatus) Or (@AppStatus is null))
AND ((tL.LogTime>= cast(@StartDate as datetime))
AND (tL.LogTime<= cast(@EndDate as datetime)))
ORDER BY tAs.AppStatusId DESC |
Ik kan dus zoeken op ID1,ID2,ID3,ID4, AppStatusid en LogTime.
Het resultaat dat ik hier uit krijg zijn alle regels waar de dubbele regels gegroepeerd zijn. Ik wil dus hebben dat hij ze op AppStatusID groepeerd en zorgt dat als in die groepering ergens een veld ID1 gevuld is dat die getoond wordt. Zo ook voor ID2, ID3 en ID4. Dit laatste doe ik nu Clientside en dat kan niet de bedoeling zijn.
Ik heb al een werkende versie gehad met subselects, maar die was zo ongelooflijk traag dat het niet werkbaar was.
Welke kant moet ik opzoeken?!
PS: Qua indexen kan ik helaas niets winnen, aangezien die het wegschrijven van logregels zouden vertragen (dat gebeurt namelijk nogal vaak).