Ich habe eine Statistik-Tabelle (anhängen nur), deren aktive Datensatz ist derjenige mit der höchsten WordsRead
und MinutesRead
pro UserId
, BookId
, UserGroupId
und Date
.Effizientere Art, diese Abfrage zu schreiben?
Jetzt möchte ich die Summe MinutesRead
und PagesRead
seit einem bestimmten Datum finden.
Diese Abfrage funktioniert ... aber es ist schrecklich langsam über einen großen Zeitraum:
SELECT Minutes = SUM(r.MinutesRead), Pages = SUM(r.PagesRead)
FROM (SELECT DISTINCT r.Date, r.UserId, r.BookId, r.UserGroupId
FROM dbo.ReadingStatDaily r
WHERE r.Date >= @p0) r0
CROSS APPLY (SELECT TOP 1 r.MinutesRead, r.PagesRead
FROM dbo.ReadingStatDaily r
WHERE r0.Date = r.Date AND r0.UserId = r.UserId AND r0.UserGroupId = r.UserGroupId AND r0.BookId = r.BookId
AND r.Date >= @p0
ORDER BY r.WordsRead DESC, r.PagesRead DESC) r
Ausführungsplan sieht wie folgt aus:
keine Scans, Schlüsselsuche oder jede andere niedrig hängenden Frucht.
Irgendwelche anderen Ideen, wie ich bessere Leistung aus dieser Abfrage erhalten könnte?
Bitte bearbeiten Sie Ihre Frage, um die DDL der relevanten Tabelle, einige Beispieldaten als DML und das gewünschte Ergebnis einzubeziehen. –