AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firebird Datenbankgröße
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird Datenbankgröße

Ein Thema von haentschman · begonnen am 2. Mai 2014 · letzter Beitrag vom 3. Mai 2014
Antwort Antwort
Dejan Vu
(Gast)

n/a Beiträge
 
#1

AW: Firebird Datenbankgröße

  Alt 2. Mai 2014, 15:17
Ist das mit dem Platz im Jahr 2014 wirklich ein Problem?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Firebird Datenbankgröße

  Alt 2. Mai 2014, 15:25
Ist das mit dem Platz im Jahr 2014 wirklich ein Problem?
Von Anfang an Platz zu sparen und die Performance zu optimieren zeugt immer von zukunftsorientiertem Denken. Irgendwann ist nämlich 2015 oder es sollen noch mehr Geräte eingebunden werden oder der Zugriff erfolgt in eine Cloud mit begrenzeter Bandbreite oder...

Leider ist das Denken "wieso Performance? Ich hab unendlich viel Speicher und Dutzende von Prozessorkernen." genau so weit verbreitet wie die Verwechselung einer IDE mit einem Point-And-Click-Adventure.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: Firebird Datenbankgröße

  Alt 2. Mai 2014, 16:52
Ist das mit dem Platz im Jahr 2014 wirklich ein Problem?
Von Anfang an Platz zu sparen und die Performance zu optimieren zeugt immer von zukunftsorientiertem Denken.
Vielleicht kannst Du Deine Speicherung auch der auf dem Gerät angleichen.
Sind das wirklich individuelle Werte oder sind das Fixtexte? Je nach Anzahl der möglichen Fixtexte könnte man das dann als Index auf ein konstantes Fixtext-Array bzw. eine entsprechende normalisierte Fixtext-Tabelle verkleinern.
Nachteil wäre die Rechnerei die Du beim Auswerten hättest. Immer das Selbe: Platzersparnis <> Performance.
Das deckt sich jetzt nicht direkt mit 'Performance optimieren', sondern mit 'Speicherplatz sparen à la 1970'.

Das man Fehler speziell am Anfang vermeiden soll, ist mir auch klar, nur baut man manchmal eben auch am Anfang Fehler ein. Und wenn man schon überlegt, mit sparse-array Techniken hier Platz zu sparen, dachte ich mir, ich hebe mal einen Zeigefinger.

Wir leben im Jahr 2014, wo Festplattenspeicherplatz in Tera- und Petabytes gemessen wird. Wir sollten uns nicht darüber über Gebühr Gedanken machen, eine Datenbank von 1.6GB auf vielleicht 800GB zu komprimieren. Da spart man an Festplatten eigentlich kaum was (ok, sagen wir: alle 500 Jahre eine TB-Platte, oder bei 500 Geräten 1x pro Jahr 1 TB).

Wenn es ein Bug oder eine Fehleinstellung ist: Ja, natürlich muss man das in Ordnung bringen. Wenn ich signifikant Geld spare, auch ok. Aber das muss man immer wieder neu überlegen. Ich persönlich würde mich hüten, hier zu viel Energie hineinzustecken.

Geändert von Dejan Vu ( 2. Mai 2014 um 17:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.457 Beiträge
 
Delphi 12 Athens
 
#4

AW: Firebird Datenbankgröße

  Alt 2. Mai 2014, 15:34
Danke an Alle...

@Union: interessante Ansätze.
Zitat:
Wie groß wird diese ID maximal?
unbekannt. Vermute 6 stellig. Für einen SmallInt zu groß. Außerdem benötige ich später sowohl den Timestamp als auch den Parameter im SQL bei den Auswertungen. Da bleibt nicht mehr viel übrig.
Zitat:
Wenn man die Basis des Timestamp (den Offset 0) in die nähere Vergangenheit setzt, kommt man auch mit weniger Platz aus.
Du meinst so nah, daß der Rest in einen SmallInt paßt? Geht nicht.
Im Beispiel: letzter DS = 1398999942 erster = 1381299573
Zitat:
Sind das wirklich individuelle Werte oder sind das Fixtexte?
Kann sowohl ein Zeichen ('+'), ein digitaler Wert ('0'/'1') oder ein analoger Wert ('-999.99' bis '999.99') sein. In der ersten Version waren das sogar getrennte Felder. Varchar(10) soll das absolute Maximum darstellen. Der Platzbedarf sollte ja nur so groß sein wie die Daten oder? Der Timestamp könnte auch ein TDateTime sein. Was braucht weniger Platz?

Zitat:
Ist das mit dem Platz im Jahr 2014 wirklich ein Problem?
Da macht es die Masse über die Dauer. Im Maximum könnten 500 Geräte für 10 Jahre gespeichert werden. (rechnerisch derzeit ca. 11 TB) Im Normalfall reden wir über 1 - 3 Geräte. Da ist das natürlich kein Problem...

PS: Es geht um Temperaturaufzeichnungen in der Lebensmittelbranche und Pharmaciebranche. Die genauen Speicherzeiträumen per Gesetzt sind mir unbekannt. Da aber das Finanzamt 10 Jahre Aufbewahrung hat ging ich mal ebenso davon aus.
Rein theoretisch hat das Gerät einen Speicherzyklus von 1-3 Jahren je nach Auflösung. Dann werden die ersten Daten wieder überschrieben. Per Gesetz sind die so zugelassen und man könnte die DB Speicherung auch darauf begrenzen. Ich will aber einen Mehrwert für den Kunden. Quasi das was die Hardware nicht leistet.

Zitat:
Übersehen nicht, nur nicht explizit drauf eingegangen. Aufgrund der Beschreibung bin ich davon ausgegangen, dass die Daten einmal importiert werden um dann für Auswertungen vorgehalten werden bzw. bei Aktualisierungen die Daten als "Masseninserts" rein kommen und nicht individuell von den Anwendern geändert werden können / sollen. Und hier würde ich (wenn die DB-Größe wirklich ein Thema sein sollte) ggf. die beschrieben Dinge anwenden.

Unter 2.5 soll es ja auch möglich sein über StoredProcedures auf anderen DBs zugreifen zu können. Somit könnten diese Gerätedaten in eigene, ggf. auch als Read-OnlyDBs ausgelagert werden und die Pages voll gemacht werden.
Im Prinzip sind die Daten als ReadOnly zu betrachten und werden nur für Auswertungen etc. vorgehalten. Um aber die Größe nicht bis ins unendliche wachsen zu lassen sollen die Ältesten nach einem Zeitraum X entfernt werden.

Geändert von haentschman ( 2. Mai 2014 um 16:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Firebird Datenbankgröße

  Alt 2. Mai 2014, 17:07
.
Zitat:
Wie groß wird diese ID maximal?
unbekannt. Vermute 6 stellig. Für einen SmallInt zu groß. Außerdem benötige ich später sowohl den Timestamp als auch den Parameter im SQL bei den Auswertungen. Da bleibt nicht mehr viel übrig.
6Stellig halte ich für arg wenig. Bei 10 Geräten über 10 Jahre und 300 Tagen sind das gerade mal 33 Meßwerte am Tag.

Zitat:
F_VALUE STRING10
Zitat:
Kann sowohl ein Zeichen ('+'), ein digitaler Wert ('0'/'1') oder ein analoger Wert ('-999.99' bis '999.99') sein. In der ersten Version waren das sogar getrennte Felder. Varchar(10) soll das absolute Maximum darstellen. Der Platzbedarf sollte ja nur so groß sein wie die Daten oder?
Das kommt mir sehr seltsam vor. Ist es vllt. so daß ein Gerät nur 0/1 und ein anderes -999.99...+999.999 liefert?
aber wieso dann 10 Stellen?
wäre es da nicht vllt. besser ein Char (0,1,A..z..) und ein float-Feld zu nutzen?
(ich kenn die FB-Typen nicht sooo genau)

Noch ein Nachsatz zum Platzsparen. es ist Blödsinn Informationen so zu verstümmeln, daß sie u.U. wertlos werden - die Erhöhung eines Basidatums gehört für mich dazu. Aber die Einstellung Festplattenkapazität mißt sich in TByte da kann ich auch mal ein paar GByte über die Leitung schicken baut beim Anwender gewaltig Frust auf wenn er, weil sein Netzanschluß unterdimensioniert ist, wieder einmal 2 Minuten auf eine Antwort/Sendung warten darf.
(nichts für ungut, aber heute war unser Firmennetz wieder vollkommen zu ...)

Gruß
K-H

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: Firebird Datenbankgröße

  Alt 2. Mai 2014, 17:29
... ich auch mal ein paar GByte über die Leitung schicken baut beim Anwender gewaltig Frust auf wenn er, weil sein Netzanschluß unterdimensioniert ist, wieder einmal 2 Minuten auf eine Antwort/Sendung warten darf.
(nichts für ungut, aber heute war unser Firmennetz wieder vollkommen zu ...)
Das ist ärgerlich. Wenn die Daten durch eine Leitung sollen, würde ich auch überlegen, wie ich das optimieren kann (sparse array), aber in einer DB achtet man auf korrekte Datengrößen. Bei einer Produktions-DB achtet man auf 3NF, aber bei einem Datengrab achtet man auf performante Auswertbarkeit.

Wenn also die Messdaten wirklich nur abgelegt werden sollen, ist eine Einzelspeicherung u.U. auch ein Overkill. Du könntest die Daten einfach in ein 'Array Of TRecord' ablegen und z.B. jeweils Arrays a 1000 Werte mit Zeitstempel ablegen. Ist zwar ziemlich bescheuert, aber mit SQL willst Du an die Einzeldaten dann ja eh nicht. Man kann auch zippen, um Redundanzen herauszuziehen und so z.B. eine ganze Stunde Messdaten eines temperierten Raumes (da ändert sich dann nicht viel) ziemlich platzsparend unterbringen. Die Daten sind in einem BLOB und der ist in einer separaten Datei und bis auf den Header in der Tabelle ist alles andere dynamisch.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.457 Beiträge
 
Delphi 12 Athens
 
#7

AW: Firebird Datenbankgröße

  Alt 2. Mai 2014, 18:04
Gut, ich drösel das mal auf:

1 Gerät, 1-100 Devices(Busadressen) im 485er Bus. Jedes Device hat unterschiedliche Parameter (F_PARAMETER_ID) (Anzahl und Typ) welche von mir vor dem Datenabholen eine eindeutige ID bekommen. Diese wird dann in den RecordDaten den Bezug zum Gerät/Adresse herstellen.
Im Schnitt hat jedes Device(Busadresse) 13 Parameter, mal mehr mal weniger. Jeder Parameter kann entweder einen String (*, +), einen Index (0-4), einen Boolean (0,1) oder einen Float Wert (-999.99 - 999.99) haben. Deshalb die Speicherung als Char was alles abdeckt.
Beispiel: Bild 1

Zitat:
...aber mit SQL willst Du an die Einzeldaten dann ja eh nicht
Doch allerdings. Bsp. "Alle Daten der Parameter 100 und 101 im Zeitraum von bis" -> als Grafik

Zitat:
6Stellig halte ich für arg wenig
Damit war die ParameterID gemeint. 100 Adressen * 13 Parameter = 1300 bei Autoinc. Meine Aussage "unbekannt. Vermute 6 stellig." war eine Verwechslung. Es gibt noch eine ParameterID innerhalb des Devices(Busadresse) welche nur innerhalb der Adresse eindeutig ist.

Zitat:
Bei 10 Geräten über 10 Jahre und 300 Tagen sind das gerade mal 33 Meßwerte am Tag.
Im aktuellen Fall wird jeder Parameter 15 sekündlich aufgezeichnet. Dies kann auf sekündlich verringert werden.
damit ergeben sich pro Minute 100 Adressen * 13 Parameter * 4 = 5200 Datensätze/ Meßwerte

Zitat:
wäre es da nicht vllt. besser ein Char (0,1,A..z..) und ein float-Feld zu nutzen?
Deswegen habe ich ja als Datenbankfeld den "kleinsten gemeinsamen Nenner". Aktuell probiere ich als Value Char(7) und als PowerState Char(1) aus. Ich tippe auf 1,2GB statt 1,6GB wie vorher
Angehängte Grafiken
Dateityp: png Record Data.png (5,2 KB, 15x aufgerufen)

Geändert von haentschman ( 2. Mai 2014 um 18:08 Uhr)
  Mit Zitat antworten Zitat
hstreicher

Registriert seit: 21. Nov 2009
223 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Firebird Datenbankgröße

  Alt 2. Mai 2014, 19:07
Firebird verwendet eine RLE Komprimierung mit einem Byte für die Länge, es ist also für den Speicherbedarf egal ob das Feld als
Varchar(10) oder Varchar(100) definiert wird, wenn es meist weniger sind wie 8 Char im Varchar

das Varchar hat ein Integer(?16Bit?) als Länge das Varchar(10) belegt also maximal 12 Byte (Single Byte Charset vorrausgesetzt)

Auf der anderen Seite hat ein CHAR Feld immer nur die angegebene Länge also Char(10) hat eine Länge von 10
wird aber mit Spaces gepadded

zu beachten ist hier natuerlich auch der definierte Zeichensatz
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
695 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Firebird Datenbankgröße

  Alt 3. Mai 2014, 11:34
zum vor und nachteil von char oder varchar bei Firebird:

Beim Speichern braucht Firebird für ein varchar mit gleichem Inhalt 2 Byte mehr als wenn es in einem Char gleicher maximallänge gespeichert wäre. Darin speichert Firebird die Datenlänge. Bei x Millionen Records also schon ein Vorteil, wenn man den char nimmt, der braucht diese beiden Bytes nicht. Abgesehen von den beiden Längenbytes speichert Firebird Inhalte von char und varchar in gleicher Länge, d.h. nahezu immer die reinen benutzten bytes plus ein wenig Overhead (lange chars/varchars mal ausgenommen).

Leider kein Vorteil ohne Nachteil, denn während varchars im Netzwerk als reine Nutzdaten + overhead übertragen werden, werden chars mit Leerzeichen aufgefüllt, leider auch + overhead. Bei den Beispieldaten hier sind das mit 3 Records 20 Byte (188 zu 168 Byte) weniger, also ca. 10 % weniger netzwerktraffic, wenn man den varchar nimmt. Da das Netzwerk meistens wesentlich langsamer ist als der Zugriff auf die Festplatte bzw der bereits im Ram gecachten Daten, ist bei netzwerkintensiven Programmen meistens der varchar vorteilhaft, bei archivierten Daten, die selten abgefragt werden oder wirklich festen Längen aber manchmal eben auch der char.
Dann bringt es dann ggf. wesentlich mehr, die von dir beschriebenen Varianten der Messwerte über Nachschlagetabellen mit einem 4 Byte integer als Foreign Key zu verbinden, wenn man schon um jedes Byte kämpfen will.

Datenpaket mit varchar

Code:
 
CREATE TABLE T1 (
    ID  BIGINT NOT NULL,
    TXT VARCHAR(20)
);

Daten

ID    TXT
1    ABC
2    ABCDEF
3    ABCDEFGHIJKLMNOP

SQL

select * from T1

Netzwerkprotokoll Ausschnitt mit tcpipexpert erstellt

## 12:06:16:597 Channel 2; DATA (Server -> Client): Length= 168
00 00 00 09 00 00 00 01 00 00 00 00 00 00 00 00                 
00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00                 
00 00 00 42 00 00 00 00 00 00 00 01 00 00 00 00     B          
00 00 00 01 00 00 00 00 00 00 00 03 41 42 43 00              ABC
00 00 00 00 00 00 00 42 00 00 00 00 00 00 00 01         B      
00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 06                 
41 42 43 44 45 46 00 00 00 00 00 00 00 00 00 42  ABCDEF        B
00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 03                 
00 00 00 00 00 00 00 10 41 42 43 44 45 46 47 48          ABCDEFGH
49 4A 4B 4C 4D 4E 4F 50 00 00 00 00 00 00 00 42  IJKLMNOP      B
00 00 00 64 00 00 00 00                             d

Datenpaket mit char

Code:
CREATE TABLE T2 (
    ID  BIGINT NOT NULL,
    TXT CHAR(20)
);

ID   TXT
1   ABC
2   ABCDEF
3   ABCDEFGHIJKLMNOP

SQL

select * from T2

Netzwerkprotokoll Ausschnitt mit tcpipexpert erstellt

12:06:29:002 Channel 2; DATA (Server -> Client): Length= 188
00 00 00 09 00 00 00 01 00 00 00 00 00 00 00 00                 
00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00                 
00 00 00 42 00 00 00 00 00 00 00 01 00 00 00 00     B          
00 00 00 01 00 00 00 00 41 42 43 20 20 20 20 20          ABC    
20 20 20 20 20 20 20 20 20 20 20 20 00 00 00 00                 
00 00 00 42 00 00 00 00 00 00 00 01 00 00 00 00     B          
00 00 00 02 00 00 00 00 41 42 43 44 45 46 20 20          ABCDEF
20 20 20 20 20 20 20 20 20 20 20 20 00 00 00 00                 
00 00 00 42 00 00 00 00 00 00 00 01 00 00 00 00     B          
00 00 00 03 00 00 00 00 41 42 43 44 45 46 47 48          ABCDEFGH
49 4A 4B 4C 4D 4E 4F 50 20 20 20 20 00 00 00 00  IJKLMNOP      
00 00 00 42 00 00 00 64 00 00 00 00                 B  d
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
Firebird 5 Update und Know-how Workshop – 28.8.-29.08.2025 64546 Mörfelden - Walldorf

Geändert von IBExpert ( 3. Mai 2014 um 11:42 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:30 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