![]() |
Datenbank: Gesucht • Version: egal • Zugriff über: bevorzugt UniDAC
Gibt es ein DBMS mit einer Art Pointer-Typ?
Hallo DP!
Ich hatte heute eine etwas "wilde" Idee, wie ich die Write-Performance unserer HMI-Client-Server Suite verbessern könnte. Aktuell steckt hier eine MariaDB/MySQL hinter, und je nach (projektspezifischem) Aufbau der Daten in der SPS landen diese aus diversen Quellen (ich definiere hier mal "eine Quelle" als eine am Stück übertragbare Menge an Daten von der SPS) in diversen Tabellen. Mit quasi beliebigem Datentyp. Theoretisch kreuz und quer, und diese Flexibilität möchte ich uns auch erhalten. (Bzw. muss, da viele alte Steuerungen noch nicht diesbzgl optimiert strukturiert wurden.) Es wäre, sowohl beim Lesen aus der SPS als auch beim Schreiben in die DB, viel performanter, wenn ich jeweils ein paar hundert Bytes am Stück verarbeiten könnte. Quasi ein Binärabbild der Speicherbereiche in der SPS in ein Blob-Feld in die DB werfen. (*) Dazu hätte ich gerne eine Kreuztabelle, die mir für jeden tatsächlichen Wert angibt in welcher Tabelle, in welchem Feld (Blob), ab welchem Byte und mit welchem Datentyp mein gewünschter Wert liegt. Dazu möchte ich aber ungerne immer den gesamten Blob aus der DB fischen und in meinem Programm zerstückeln, sondern am liebsten mein Interface zur DB weitgehend gleich behalten. Ich möchte quasi
SQL-Code:
schreiben können (nicht zwangsweise diese Form, aber mit diesen Parametern), es gibt aber gar keine Tabelle "analogwerte". Sondern stattdessen eine Tabelle, in der steht: Nimm dieses aus der Tabelle "datenbasis" aus der Spalte "raw_data" (der Blob) mit der id N, und zwar ab Byte 78, und gib das als 2-Byte Integer ohne Vorzeichen zurück.
SELECT ist_wert FROM analogwerte WHERE feldname = 'DRUCK_1.0'
Dann könnte ich nämlich einfach die Datenbausteine aus der SPS komplett in die DB werfen, und zwar auch deutlich öfter als nur jede Sekunde ein Mal, und habe mit dem Zerpflücken in logisch korrekte Strukturen in meinem Programm nicht mehr zu viel am Hut. Lohnt es sich überhaupt in diese Richtung weiterzudenken, oder gibt es kein DBMS welches sowas auch nur im Ansatz könnte? (Ich möchte ungerne Plugins für ein DBMS schreiben dafür. Es sollte alles via SQL und Ab-Werk-Funktionen gehen.) Kennt ihr ein DBMS, das sowas in der Art liefern könnte? Vielen Dank schon mal! *) Beim Lesen aus der SPS mache ich das schon, zerstückel dann aber die Daten anhand der vorgegebenen Struktur in der SPS und trage dann alle Werte einen nach dem anderen in die DB ein. Das wird bei ein paar hunderten irgendwann recht langsam, selbst wenn ich mittlerweile pro Tabelle sogar mit nur einem INSERT auskomme. Da dort aber heftige WHERE-IN-() und CASE Konstrukte enthalten sind (da nicht jedes mal immer alle Zeilen und/oder die gleichen Spalten einer Tabelle in einem Durchgang beschrieben werden), ist das in entsprechender Menge ebenfalls bremsend. Besonders wenn zudem auch noch repliziert wird! |
AW: Gibt es ein DBMS mit einer Art Pointer-Typ?
Ich denke schon, das das geht, auch in mySQL. Du kannst deine SQL Statements ja dynamisch erzeugen, also auch den Tabellennamen über eine Funktion erzeugen lassen. Oder du baust dir entsprechende Views. Oder du arbeitest mit derived tables.
Ich würde mal so beginnen, dass ich eine Struktur baue, die die Daten so aufnimmt, wie ich es gern hätte + dann überleg ich mir mögliche Zugriffspfade. Aber leider: In der Regel geht entweder schreiben oder lesen schnell - und je komplexer die Daten, desto deutlicher wird der Unterschied. Soll heißen, du musst möglicherweise überlegen, wie hoch der Preis ist, den du beim Lesen bezahlen möchtest. In Pseudocode könnte das ja so aussehen: select start from ... Where ... select length from ... Where ... SELECT ist_wert FROM (select substr(rawdata, start, length) as ist_wert from rawdatatable) as analogwerte WHERE feldname = 'DRUCK_1.0' |
AW: Gibt es ein DBMS mit einer Art Pointer-Typ?
Hmm, was mir hier fehlt ist der cast der Datentypen. Ich Lese ja keine Strings aus der SPS, sondern Binärdaten. Mit einem Substr() werde ich da glaube ich nicht anrücken können, oder?
|
AW: Gibt es ein DBMS mit einer Art Pointer-Typ?
Ich sehe da am ehesten Oracle und im Nocost Bereich Postgres.
Beide verfügen über mächtige Programmierfähigkeit und Typenfähigkeiten. Auch wenn ich Dich so verstanden habe, dass Du die nur indirekt (über SQL) nutzen willst. Im Notfall wären noch anonymous blocks einsetzbar. Clientseitig kann man natürlich beliebiges SQL zusammensetzen und "viel" erreichen. Ich stelle mir das allerdings an zentraler Stelle serverseitig "schöner" vor, halt nicht so basisdemokratisch. Unabhängig von der Programmierung sehe ich auf jeden Fall JSON bzw. konkret JSONB als Typ bei Postgres. Alternativ noch Key/Value Implementierungen. M.E. kann man Variable:Wert:Typ aber sehr gut und dynamisch mit JSON(B) abfackeln (plus andere nicht unerhebliche Themen wie Indizierung, Konvertierung, ..) Meine Vorstellung würden entgegen einer clientseitigen Implementierung in Richtung Interfacing auf DB Seite gehen. Also ein Set von Views, Schemata, vlt ein paar SP und definierte JSON Strukturen, mit denen Du die "Tabellen" definierst und baust, die Deine gewünschten Abfragen ermöglichen. P.S.: Cast/Typisierungs Möglichkeiten bei Postgres würde ich als "herrlich" bezeichnen. |
AW: Gibt es ein DBMS mit einer Art Pointer-Typ?
Ui, da sind ein paar Techniken und Begriffe bei, zu denen ich erst etwas mehr lesen muss :) Klingt aber grob nach der richtigen Richtung. Danke!
|
AW: Gibt es ein DBMS mit einer Art Pointer-Typ?
Zitat:
Was du auch machen kannst, ist ein zweites Feld, in dem die konvertierten Daten landen. Dann benutze für das INSERT schnelles schreiben + beim erstmaligen Zugriff konvertierst du die Daten + greifst in Folge auf diese zu. Also viele Möglichkeiten :- ) Ob du das Clientseitig machst oder im Server via Trigger/stored procedures/functions/views etc. ist noch mal eine andere Sache. |
AW: Gibt es ein DBMS mit einer Art Pointer-Typ?
Die Frage war ja eben welche DBMS sowas in z.B. SPs ermöglichen. Ich muss ja in der SP auf ein BLOB zugreifen, und dort ein paar beliebige Bytes herausfischen, casten (und sogar die Byte-Order vertauschen) und zurückgeben. Das wären low-level Funktionen, die mir bisher nicht in SQL begegnet sind.
Ich will das auch definitiv alles serverseitig machen! Der Client soll auf eine Abfrage hin einfach seinen einen, fertig aufbereiteten Wert bekommen, wie bisher auch. (Und das am besten noch mit nur kleinen Änderungen an der Abfrage, ich will nicht jedes Mal ein 8k langes Script mit schicken müssen :)) |
AW: Gibt es ein DBMS mit einer Art Pointer-Typ?
Schau bitte mal, ob Du in dem Umfeld von
![]() Wenn ja, müssten sich damit Datenbankfunktionen schreiben lassen können, die eingebunden in Selects, Views ..., Deinen Vorstellungen nahekommen. Wenn ich Deine Aufgabenstellung und die Dokumentation zu PostGres halbwegs rechts verstanden haben sollte, müsste damit sowas in der Art
Delphi-Quellcode:
funktionieren.
SELECT Funktion_Ist_Wert(Blobspalte) as ist_Wert FROM analogwerte WHERE feldname = 'DRUCK_1.0'
Eingebetten in Views dürfte dann im Programm Dein gewünschtes
Delphi-Quellcode:
funktionieren.
SELECT ist_wert FROM analogwerte WHERE feldname = 'DRUCK_1.0'
|
AW: Gibt es ein DBMS mit einer Art Pointer-Typ?
Wenn ich dich richtig verstanden habe, benutzt du mySQL:
Zitat:
![]() Da ist alles, was du brauchst. Da gehen auch so Sachen wie SUBSTRING deines BLOBs oder select where BLOB = x'...' zum binären Vergleich etc. Solltest du weitersuchen wollen, so haben Oracle, Postgres, MSSQL, Firebird etc ähnliches an Bord. Vor allem Oracle, aber auch MSSQL 2016 können da ein paar wirklich coole Sachen,. aber ich hätte dein Problem nicht so verstanden, dass du deshalb umsteigen müsstest. Aber vielleicht übersehe ich etwas. |
AW: Gibt es ein DBMS mit einer Art Pointer-Typ?
Mein Hinweis auf PostGres war nur als Idee gedacht.
Frei nach dem Motto: Oh, die haben sowas, dann such' ich mal, ob's das auch für meine DB gibt. Es war nicht als Vorschlag für "Erstmal die Datenbank wechseln und dann weitersehen" gedacht. Hiermit ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 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