AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Datenlogger mit MSSQL und Index-Fragmentierung
Thema durchsuchen
Ansicht
Themen-Optionen

Datenlogger mit MSSQL und Index-Fragmentierung

Ein Thema von BigAl · begonnen am 16. Jul 2025 · letzter Beitrag vom 17. Jul 2025
 
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
512 Beiträge
 
Delphi 12 Athens
 
#1

Datenlogger mit MSSQL und Index-Fragmentierung

  Alt Gestern, 20:58
Datenbank: MSSQL • Version: 2022 • Zugriff über: OLE DB oder Direct (TCPIP) oder Native
Hallo,

Ich muss für ein aktuelles Projekt Daten loggen. Dabei handelt es sich um einen relativ einfach aufgebauten Datensatz in der Form:

ID INT IDENTITY
LogTime DATETIME NOT NULL
DST BIT NOT NULL,
(... ca. 150 x real ...)

Primärschlüssel ist ID (Clustered), ein zusätzlicher Schlüssel ist für die "LogTime" definiert.

In die Tabelle werden im Sekundentakt Daten geschrieben. Also 86400 Datensätze pro Tag. Die Daten werden 90 Tage gehalten, ehe die ältesten Daten gelöscht werden. Das Schreiben wird von einer eigene Thread übernommen. Diese prüft auch einmal pro Minute, ob alte Datensätze vorhanden sind (DELETE TOP (100) FROM Table WHERE LogTime < ...).

Das Problem ist nun, dass das der von den Indizes (Indexe (?)) benötigte Speicherplatz immer weiter ansteigt und sich nie verkleinert. Ein REORGANIZE oder REBUILD schafft hier zwar Abhilfe, blockiert aber recht lange. Beim REORGANIZE handelt es sich zwar um eine Online-Funktion die theoretisch in einer unabhängigen Task laufen könnte aber die Frage ist, ob da dauerhaft hilft. Die Software muss 24/7/365 laufen und visualisiert einen recht kritischen Prozess. Die Sicherheitsfunktionen sind zwar nicht von der Software abhängig, aber wenn die Oberfläche nicht aktualisiert werde die Benutzer nervös...

Hat von Euch schon einmal jemand sowas gemacht? Wie bekommt ihr das in den Griff? Letztendlich soll die Datenbank nur bis zu einem bestimmten Punkt wachsen (86400 * 90 = 7.7 Mio. Datensätze) und dann möglichst in dieser Größe verharren. Die Daten selbst geben ja den Speicher nach dem DELETE wieder für neue Daten frei, aber der vom Index benötigte Speicher wächst kontinuierlich.

Mein Wunsch wäre, das ganze auf einem MS SQL-Express Server laufen zu lassen. Rechnerisch benötige ich ca. 5 bis 6 GB für die gesamte Datenbank (es gibt noch ein paar andere Tabellen die aber selten beschrieben werden). Grundsätzlich wäre der Express-Server mit 10 GB Datenbankgröße und von der Geschwindigkeit ausreichend.

Man könnte natürlich auch ein eigenes Datenfile für die Logger-Daten erstellen, da diese eh immer sequentiell sind, aber das würde viele andere Dinge verkomplizieren.

Also: Hat jemand eine Idee wie man einen Ringpuffer mit MS SQL sinnvoll implementieren kann? Wie macht ihr sowas?

Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz