Re: Logtabelle mit vielen Werten
- From: Robert Klemme <shortcutter@xxxxxxxxxxxxxx>
- Date: Sun, 21 Jan 2007 23:44:28 +0100
On 21.01.2007 20:59, Wilfried Hafner wrote:
Ich möchte gerne ständig Daten (ca. alle 10sek bis 5min) irgendwelcher Variablen aufzeichnen. Die Daten sind alle vom Typ FLOAT(8). Gesucht wird später immer nach Zeitstempel und Variablenname. Meistens werden die Daten der letzten 1 bis 2 Wochen abgerufen, insgesamt sollen aber die Daten der letzten 1 bis 2 Jahre zur Verfügung stehen.
Ich habe nun eine Logtabelle die folgendermaßen aussieht:
id -> Bigint
time_stamp -> DateTime
time_stamp_ms -> Int
variable -> Varchar(50)
val -> Float
Der PK sitzt auf id und time_stamp. Weiters gibt es einen Index auf time_stamp und variable. Beide Indexes sind nicht clustered.
Die Abfrage sieht folgendermaßen aus:
SELECT time_stamp, time_stamp_ms, val
FROM log_variables
WHERE log_variables.variable = @variable AND
log_variables.time_stamp >= @startdate AND
log_variables.time_stamp <= @enddate
Jetzt hab ich so ca. 3Mio. Datensätze von ca. 1000 verschiedenen Variablen und die Abfrage dauert 20 bis 40 Sekunden oder noch länger. Ich hab auch schon probiert die Indexes anders zu setzen, aber ohne großen Erfolg. Habt ihr irgendwelche Vorschläge zur Optimierung? Weiters hab ich mir gedacht, z.B. eine 2te Tabelle anzulegen, in der ich alle Datensätze ablege, welche älter als 2 Wochen sind, dann hätt ich immer einen schnellen Zugriff auf die aktuellen Daten, ist das sinnvoll oder kann man die Tabelle doch so optimieren, dass es einigermaßen vernünftig läuf? Wenn man die Daten umkopiert, wie geht man dann üblicherweise vor? Schreibt man einen 2ten Prozess der jeden Tag einmal aufgerufen wird und der die Daten umkopiert oder gibt es andere Möglichkeiten?
Das Naheliegendste ist, einen CI auf (time_stamp, variable) zu setzen. Falls es sicher ist, dass es in einer Millisekunde nur einen Wert für eine Variable gibt, kannst du auch gleich den PK Clustered auf (time_stamp, variable, time_stamp_ms) setzen. Beide vorgeschlagenen Alternativen reichen alleine für die Abfrage, die du gezeigt hast. Jeder weitere Index ist überflüssig und kostet eher (Platz und Zeit beim Einfügen). (CI empfiehlt sich wegen der Abfrage nach Zeiträumen mit > und <, weil er sortiert ist).
Ich verstehe nicht, wofür du überhaupt die id brauchst. Ist die Tabelle mit einer anderen verknüpft? Wenn nicht, kannst du die Spalte schon mal sparen (droppen).
Und bei der aktuellen Information würde ich die Daten nicht auf zwei Tabellen aufteilen, da der vorgeschlagene Index den Zugriff schon recht schnell machen sollte und du dir das unnötige Umkopieren sparst. Wenn du einen von den beiden CI's anlegst, geht auch das Löschen nach Zeitstempel schnell, weil der die erste Spalte im Index ist.
Ciao
robert
.
- Follow-Ups:
- Re: Logtabelle mit vielen Werten
- From: Wilfried Hafner
- Re: Logtabelle mit vielen Werten
- From: Hannes Brunner
- Re: Logtabelle mit vielen Werten
- References:
- Logtabelle mit vielen Werten
- From: Wilfried Hafner
- Logtabelle mit vielen Werten
- Prev by Date: Logtabelle mit vielen Werten
- Next by Date: Re: Logtabelle mit vielen Werten
- Previous by thread: Logtabelle mit vielen Werten
- Next by thread: Re: Logtabelle mit vielen Werten
- Index(es):
Relevant Pages
|