Re: Logtabelle mit vielen Werten

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



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

.



Relevant Pages

  • Re: Logtabelle mit vielen Werten
    ... Weiters gibt es einen Index auf time_stamp und variable. ... Datensätze von ca. 1000 verschiedenen Variablen und die Abfrage dauert 20 bis 40 Sekunden oder noch länger. ... Weiters hab ich mir gedacht, z.B. eine 2te Tabelle anzulegen, in der ... kannst du die Spalte schon mal sparen. ...
    (microsoft.public.de.sqlserver)
  • Re: Indexe beissen sich? (Dau-Frage)
    ... > Mit und ohne MAXDOPgibts bei obiger Abfrage mit und ohne Indexe ... > Nachdem ich den Index des Optimieres benutzt habe gabs folgenden Plan: ... SELECT FROM ziemlich trödelig. ... Tabelle gesperrt werden. ...
    (microsoft.public.de.sqlserver)
  • Re: Index Contra Table Scan
    ... In der Datenbank gibt es eine Tabelle mit ca. 750000 Datensätzen. ... So nun wollte ich einen Index einfach auf das Feld vereinbaren. ... Doch leider will mir der Betreuer der Datenbank nicht glauben dass der Index ... Meine Abfrage wird etwa 600-mal am Tag mit verschiedenen Parametern ...
    (microsoft.public.de.sqlserver)
  • Re: create index
    ... Ich habe über eine Abfrage in Access einen Index erstellt: ... Mit der Anweisung ... >dauerhaft in der Tabelle anzulegen. ...
    (microsoft.public.de.access)
  • Abfrage mit Zeitintervallen + Bedingung
    ... Ich habe eine Tabelle die unter anderem ein Feld für einen Zeitstempel ... Die Abfrage soll folgendes abbilden: ... Eintrag in der Tabelle generiert haben. ...
    (de.comp.datenbanken.mysql)