none
Umsetzung einer Prozessdatenerfassung mit SQL Server RRS feed

  • Frage

  • Hallo zusammen, mein Ziel ist die Umsetzung einer Prozessdatenbank mittels SQL Server. Hiebei sollten sequenziell abgerufene Daten mittels SOA in einer Datenbank gespielt werden. Unter Prozessdaten kann man sich Werte wie Temperatur, Druck usw. vorstellen welche im Minutentakt abgerufen werden. Die Prozessdaten sollten von mindestens 10 Standorten auf der Welt zur Verfügung gestellt werden. Mit einer Erstellung der Datenbank habe ich bereits begonnen wobei erste Versuche mit SQL Server Express bereits durchgeführt worden sind.

    Das Problem:

    Wenn ich es richtig versanden habe, muss jeder Prozesswert (Druck, Temperatur) einer eindeutigen ID in einer Tabelle zugeordnet sein. Es ist mir nicht möglich zwei Spalten mit Druck und Temperatur zu erzeigen welche die Prozesswerte beinhalten da hierbei die Eindeutigkeit der Daten in der Tabelle verloren geht (diese sind ja nicht immer Unterschiedlich). Da die ID bzw Primary Key vom Typ integer bzw real ist, hat diese eine eindeutige Größe und es würde mit zunehmender Datenmenge zu einem Überlauf oder Fehler kommen.

    Meine Fragestellung:

    • Wie realisiert man in SQL Server grundsätzlich eine Prozessdatenbank? Gibt es hier Referenzprojekte welche man sich ansehen kann?
    • Wie löse ich das Problem mit der Eindeutigkeit der Daten in einer Tabelle bzw. den Überlauf des Primary Keys bei zunehmender Datenmenge? Muss eine ID überhaupt vorhanden sein oder würde hierbei ein einfacher Timestamp ("datetime") genügen?

    Wie man nicht schwer erkennen kann bin ich noch relativ neu in diesem Gebiet und würde mich über ein paar Literaturreferenzen sehr darüber freuen.

    Mittwoch, 30. August 2017 13:48

Antworten

  • Nun, ein 32-Bit-Wert kann 2^31 (über 2 Milliarden) Werte darstellen, als Unsigned sind dies dann ca. 4 Milliarden.
    Wenn du jede Sekunde 1 Wert erstellst hast du knapp 68 bzw. 136 Jahre Zeit.
    Kritisch wird es dann bei z.B. 100 Werten/Sekunde.
    Bei einem 64-Bit erhöht sich das dann um Faktor 2^32 (4 Milliarden * 68/136)!
    Ich glaube vorher erlischt die Sonne;-).

    Bei GUID (128) Bit hast du dann noch mal 2^64 Mal mehr Zeit als bei 64-Bit.

    Dein Problem wird da eher der Plattenplatz sein und die Kapazität des SQL-Servers.
    Selbst wenn du 1000 Werte/Sekunde erstellst hast du noch genügend Zeit.

    Umgekehrt stellt sich da eher die Frage was mit den Daten gemacht wird.
    Ein SQL-Server kann z.B. im Durchschnitt bei einer Abfrage ca. 10.000 Zeilen bearbeiten (wenn sie kurz sind).

    Um also 1 Milliarden Zeilen zu aggregieren benötigt dieser bereits knapp 30 Minuten!
    Dies kann man durchaus mit mehreren Prozessoren / Servern beschleunigen.

    • Als Antwort markiert D4niel-F Donnerstag, 31. August 2017 06:59
    Mittwoch, 30. August 2017 16:14

Alle Antworten

  • Hallo Daniel,
    die ID, die Identity Spalte sollte vom Typ int oder bigint sein.
    Wenn Dir nun der Wertebereich nicht ausreicht, kannst Du selbstverständlich als Primärschlüssel ein GUID nehmen.
    Hier ein Beispiel mit Create Statement:
    https://blogs.msdn.microsoft.com/sqlserverfaq/2010/05/27/guid-vs-int-debate/

    Nur bist Du sicher das es nur die 2 Spalten gibt?

    Es scheint als ob das noch eine Information der Quelle - die Zehn Standorte und eine Datums/Uhrzeitangabe dazugehört. 
    Ist dem so?  Dann soll deine Eindeutigkeit doch auf den Spalten Temperatur /Druck /Standort / DatumUhrzeit liegen.
    Und das soll dann aber doch das Datum und die Uhrzeit der gemessenen Werte sein. Der Timestamp würde am ehesten der Uhrzeit entsprechen an dem die Daten eingearbeitet wurden. 
    Hier steckt ja evtl.  noch eine Zeitzone drin?
    HTH 

    Grüße Alexander

    Mittwoch, 30. August 2017 14:46
  • Gibt es hier Referenzprojekte welche man sich ansehen kann?

    Siehe http://www.databaseanswers.org/data_models/index.htm, z.B. => 28. Events => Complex Event Processing

    den Überlauf des Primary Keys bei zunehmender Datenmenge?

    Der Datentyp "int" hat einen Wertebereich von 4 Mrd, bei 10 Station * 2 Messwert je Minute kannst Du Werte für die nächsten 380 Jahre speichern; bis das Problem also auftritt, bist Du längst in Rente ;-)

    muss jeder Prozesswert (Druck, Temperatur) einer eindeutigen ID in einer Tabelle zugeordnet

    Muss nicht, sollte aber schon. Man kann aber auch kombinierte Keys aus mehreren Spalten anlegen, z.B. Messzeitpunkt + Standort + Messwertart (Druck, Temperatur)


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 30. August 2017 16:05
  • Nun, ein 32-Bit-Wert kann 2^31 (über 2 Milliarden) Werte darstellen, als Unsigned sind dies dann ca. 4 Milliarden.
    Wenn du jede Sekunde 1 Wert erstellst hast du knapp 68 bzw. 136 Jahre Zeit.
    Kritisch wird es dann bei z.B. 100 Werten/Sekunde.
    Bei einem 64-Bit erhöht sich das dann um Faktor 2^32 (4 Milliarden * 68/136)!
    Ich glaube vorher erlischt die Sonne;-).

    Bei GUID (128) Bit hast du dann noch mal 2^64 Mal mehr Zeit als bei 64-Bit.

    Dein Problem wird da eher der Plattenplatz sein und die Kapazität des SQL-Servers.
    Selbst wenn du 1000 Werte/Sekunde erstellst hast du noch genügend Zeit.

    Umgekehrt stellt sich da eher die Frage was mit den Daten gemacht wird.
    Ein SQL-Server kann z.B. im Durchschnitt bei einer Abfrage ca. 10.000 Zeilen bearbeiten (wenn sie kurz sind).

    Um also 1 Milliarden Zeilen zu aggregieren benötigt dieser bereits knapp 30 Minuten!
    Dies kann man durchaus mit mehreren Prozessoren / Servern beschleunigen.

    • Als Antwort markiert D4niel-F Donnerstag, 31. August 2017 06:59
    Mittwoch, 30. August 2017 16:14
  • Anstelle hier über die maximale Größe eines Datentyps zu dozieren, möchte ich gern meinen Rat geben.

    Das richtige Design beginnt beim Datenbank-Schema:

    Leg Dich nicht so sehr auf Eine Tabelle fest, in der Du alles (mithilfe dieses maximalen Datenbereiches) ablegst, sondern überlege Dir ein schlaues, partitioniertes Design. Das ist für die Performance noch wichtiger als die Frage nach int oder bigint. - Wer GUIDs benötigt, hat es sehr wahrscheinlich schon verbockt.

    Und natürlich hat jedes System andere Anforderungen an Transaktionsdurchsatz, und wird daher nie gleich designt werden (müssen).

    Ich hoffe, das hilft als Denkanstoß. Mehr soll es gar nicht sein in diesem Rahmen.


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform/SQL Server 2012
    MCM SQL Server 2008
    MVP Data Platform
    www.SarpedonQualityLab.com | www.andreas-wolter.com

    Montag, 4. September 2017 08:54
  • Hallo Andreas, 

    vielen Dank für deine Antwort. Ich konnte mir mittlerweile einige Ideen zum Thema Datenbank machen. Jedoch habe ich großen Respekt vor der Auswahl sowie der richtigen Strukturierung solcher Datenbankintegration da ja abhängig der zu erwartenden Datenmenge auch das Fehlerrisiko wächst.

    Ich würde mir gerne grundsätzliche Vorgehensweisen und Methoden mal genauer ansehen und würde dich gerne um einen Literaturvorschlag oder Projektreferenz bitten welche dieses Themengebiet behandelt.

    Dienstag, 5. September 2017 07:44
  • Hallo Andreas, 

    vielen Dank für deine Antwort. Ich konnte mir mittlerweile einige Ideen zum Thema Datenbank machen. Jedoch habe ich großen Respekt vor der Auswahl sowie der richtigen Strukturierung solcher Datenbankintegration da ja abhängig der zu erwartenden Datenmenge auch das Fehlerrisiko wächst.

    Ich würde mir gerne grundsätzliche Vorgehensweisen und Methoden mal genauer ansehen und würde dich gerne um einen Literaturvorschlag oder Projektreferenz bitten welche dieses Themengebiet behandelt.

    Hallo

    über Datawarehousing kann man so einiges lesen:

    Die umfangreiche Thematik von Datawarehouse-Design allen durch ein Buch zu erlernen ist sicher unrealistisch, aber als Einstieg empfehle ich "The Data Warehouse Toolkit: The Complete Guide to Dimensional Modeling" von Ralph Kimball. Später würde ich mich auch noch mit der Inmon-Methodik auseinandersetzen. Gerade für Einsteiger ist Kimball jedoch mehr geeignet und leicht nachvollziehbar.

    Spezielle Schulungen dazu gibt es meines Wissens auch keine. Selbst ich biete solche nur auf spezifischen Kundenwunsch an, da die Anforderungen doch immer zu unterschiedlich sind, und sehr speziell (gegenüber einer allgemeinen Datenbank-Programmierschulung)

    Es gibt schon Gründe, dass man bei kritischen Projekten Berater mit über einem Jahrzehnt Erfahrung im Design von Datenbanken zur Unterstützung heranholt. Denn auch die 5-6 Bücher dieser Autoren enthalten längst nicht alle möglichen Stolperfallen, Kniffe und Techniken, wie man sie gerade unter modernen Gesichtspunkten auf moderner Hardware einsetzt (seit einigen Jahren sind In-Memory Techniken verfügbar)

    Referenzprojekte, die öffentlich dokumentiert sind, und auch noch wirklich gut, kann ich keine benennen.

    Ich empfehle viel Praxis, Testen, Benchmarking und zunächst einmal: eine gute Anforderungsanalyse zu betreiben. Dabei klären sich viele Fragen. Ohne Anforderungen ist jedes Design gleichwertig gut und schlecht.

    Sorry für die nicht allzu konkrete Antwort, aber das ist die reale Welt ;-)

    der Andreas


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform/SQL Server 2012
    MCM SQL Server 2008
    MVP Data Platform
    www.SarpedonQualityLab.com | www.andreas-wolter.com

    Dienstag, 5. September 2017 14:02