String komprimierung in PostgreSQL Datenbank?
-
Hallo Leute,
ich möchste PostgreSQL Datanbank zu Datenaufzeichnung nutzen. Dabei verwende ich ein String feld als Wert ID. Wenn nun mehrere mal ein Wert mit gleicher ID geloggt werden, wie sieht es mit der Komprimierung aus? Ist PostgreSQL so gut, das mehrere mal vorkommende String-Einträge komprimiert werden??
2te Option wäre, ich würde in einer seperaten tabellen Strings über IDs eindeudtig indentifizieren, und in der Logging tabelle nur die IDs Speichern.. allerdings müsste ich dann bei jedem Log zyklus in der String/ID Tabelle nach nem string siuchen und den ID ermitteln, was bei vll. 100000 einträgen lang geht oder?
-
Schau Dir mal Postgres' Speichersystem für Strings an:http://www.postgresql.org/docs/8.3/static/storage-toast.html
ALTER TABLE dd ALTER ee SET STORAGE EXTENDED
-
hmm so wie ich lese, komprimiert PostGreSQL schon strings... aber die frage ist ehr, ob doppelt vorkommende String irgendwie komprimiert werden, so das mit hashtabel oder so gearbeitet wird etc.
-
Du meinst das Fliegengewichtsmuster? Nein, sowas muesstest Du selber implementieren.
-
exakt... das meinte ich;) hmm naja dann bräuchte sich ne zweite tabelle, welche als statischen hash dient.. diesen bei jeden start aufm heap laden und damit arbeiten.. damit mehr peformance da ist... oder wie würdest du es machen?
-
Das muss man anhand der Datenmenge/-inhalt entscheiden, wenn Du jetzt 2 Tage ein solches System implementierst wäre es für den Kunden evtl. preiswerter eine größere Platte/Storage zu besorgen. Ich würde testen, wie das geschätzte Datenwachstum sich entwickeln wird, ob es O.K. ist oder ob stärker normalisiert werden soll indem die Strings in eine separaten Tabelle ausgelagert werden sollten. In diesem Fall würde ich mir überlegen wieviele verschiedene Strings entstehen werden und ob man sie nicht einfach normal indizieren kann .
-
Wenn du doppelte Strings erwartet solltest du abwägen zw. Normalisierung und keiner Normform.
-
mal abgsehen vom datenvolumen, möchte ic hauch query über die datenbank mcahen.. würde ich es ohne (hash tabelle) machen, würde das ding ewig langsam werden bei ner abfrage, weil er jeden string vergleichen muss...
-
Dann leg' doch ein Index über die Zeichenspalte und schon hast Du nur noch logarithmischen Aufwand (wenn der Index selektiv genug ist um verwendet zu werden)
-
Wenns dir nur um die Geschwindigkeit bei Abfragen geht, dann wird ein Index vermutlich reichen.
Ansonsten stimmt es schon, dass String-Vergleich viel viel Aufwändiger sind, als Integer-Vergleiche.Und... wenn du einen Server willst, der mehrfache Strings innerhalb einer Page "wegoptimiert", dann solltest du dir den MSSQL 2008 angucken.
SQL Server kann also gleiche und ähnliche Daten aus unterschiedlichen Zeilen innerhalb einer Page komprimieren.
Wenn ich den TOAST Artikel richtig verstehe, dann kann PostgreSQL nur einzelne Felder für sich komprimieren. D.h. in dem Fall, wenn ein Feld in vielen Zeilen den selben Wert hat, dann speichert PostgreSQL dennoch für jede Zeile die vollständigen Daten.