Ich habe eine Reihe von Tabellen mit vielen hochpräzisen Daten, die von verschiedenen Geräten gesammelt wurden. Die Intervalle, in denen sie gesammelt wurden, variieren und wandern sogar über die Zeitreihen. Meine Benutzer möchten die Möglichkeit haben, einen Datumsbereich auszuwählen und einen Durchschnitt / min / max über diese Variablen mit einer bestimmten Häufigkeit zu erhalten. Dies ist der zweite Versuch, den ich unternommen habe, und er funktioniert, aber ich frage mich, ob es einen besseren / schnelleren Weg gibt, dies zu erreichen.
declare @start datetime
declare @end datetime
set @start = '3/1/2012'
set @end = '3/3/2012'
declare @interval int
set @interval = 300
declare @tpart table(
dt datetime
);
with CTE_TimeTable
as
(
select @start as [date]
union all
select dateadd(ss,@interval, [date])
from CTE_TimeTable
where DateAdd(ss,@interval, [date]) <= @end
)
insert into @tpart
select [date] from CTE_TimeTable
OPTION (MAXRECURSION 0);
select t.dt, avg(c.x1), min(c.x1), max(c.x2), avg(c.x2), min(c.x2), max(c.x2) from clean.data c ,
@tpart t
where
ABS(DateDIFF(ss, t.dt , c.Date) ) <= @interval /2
and
Date >= @start
and
Date <= @end
group by t.dt
Derzeit dauert die Ausführung dieser Abfrage über 32721 Zeilen für diesen Zeitraum von 3 Tagen ungefähr 43 Sekunden und gibt mir die 577 Zeilen, die ich erwarte, aber ich möchte dies schneller erhalten. Der große Erfolg kommt von der verschachtelten Schleife, um die innere Verbindung herzustellen.
DATEDIFF
Aussage?
ABS(DateDIFF(ss, t.dt , c.Date) )
? Sie könnten es indizieren. Macht die Operation für die c.Date
Spalte in der Spalte nach meinem Verständnis (was möglicherweise WAAAAY falsch sein kann) WHERE
den Index nicht unbrauchbar?
WHERE
Klausel verwendet werden können.
clean.data
? Können Sie auch erklären, warum Sie Cross-Joining mit@tpart
?