Jag har två tabeller. En med låt oss säga Artiklar. Ett fält - RR_ID. RR_ID är unik. Testa att använda = som operator istället för IN eftersom du ändå slltid får tillbaka en post. Jag tackar ödmjukast! Du har förgyllt min dag! Du har gjort livet värt att leva igen :) 10 tusen räcker nog inte.. Jag har ett system som loggar det mesta som en användare kan göra. Systemet används veckovis av ca 300 användare och loggningen har pågått i 1,5 år. Logtabellen har i dag >500.000 poster. Men det går bra tack vare index. Gör alltid index på de kolumner som du villkorar eller sorterar med. Har testat och det är enorma skillnader! Jag tackar så mycket för hjälpen. Dålig prestanda i en SLQ-fråga.
Den andra tabellen är en loggtabell. Den innehåller en räknare Logg_ID (unik), RR_ID för relation med den andra tabellen, Status och Datum.
Varje gång något ändras på artiklen så lägger man till en post i loggtabellen. Posten talar om den nya statusen. Datum då förändringen görs sparas. En status kan återkomma flera gånger. Man kan alltså sänka status, höja och sänka igen osv.
I Artikel-tabellen har jag 400 poster. I loggtabellen har jag 2400 poster - 6 per artikel.
Det jag vill nu är att få ut ett resultat med artiklar som för tillfället har en viss status, kanske 0, 1 och 2. Senast status kan jag ju titta på Datum och jag vill bara ha en loggpost per artikel så klart och endast vissa typer av status. Alltså alla artiklar som senast fick status 0, 1 eller 2.
Min fråga ser ut som följer:
SELECT dbo.Master.RR_ID
FROM dbo.Logg INNER JOIN
dbo.Master ON dbo.Logg.RR_ID = dbo.Master.RR_ID
WHERE (dbo.Logg.Logg_ID IN
(SELECT TOP 1 Logg_ID
FROM Logg
WHERE Logg.Status IN (0, 1, 2) AND Logg.RR_ID = Master.RR_ID
ORDER BY Datum DESC))
Problemet med denna fråga är att den tar flera sekunder att köra. Om jag kör den i Query Analyzern eller i en VIEW spelar ingen roll. Jag har SQL Server 2000. Det finns garanterat inga prestandaproblem på servern utan det har nåt med min fråga at göra.
Jag har 2400 poster i loggen i mitt exempel. I verkligheten kan det handla om 10-tusentals framöver och då vill jag inte ens tänka på vilka prestandaproblem som kommer att uppstå.
Min fråga är helt enkelt, vad är det för fel? Och hur borde jag ställa frågan istället.
Jag tycker inte mitt exempel borde vara speciellt unikt. Sv: Dålig prestanda i en SLQ-fråga.
WHERE (dbo.Logg.Logg_ID =
TOP 1 Logg_ID
FROM Logg
WHERE Logg.Status IN (0, 1, 2) AND Logg.RR_ID = Master.RR_ID
ORDER BY Datum DESC))
Där vinner du nog lite i alla fall.Sv:Dålig prestanda i en SLQ-fråga.
Anrop som tidigare tog 4,8 sekunder tar nu 0,1 sekund! Så "lite tid" vann jag allt. Tack!Sv: Dålig prestanda i en SLQ-fråga.
I ditt fall:
<code>
Logg.RR_ID
Master.RR_ID
Logg.Logg_ID
Logg.Status
Datum
</code>
Denna enkla grundregel gör att du nästan alltid är safe.Sv:Dålig prestanda i en SLQ-fråga.