![]() |
Datenbank: Firebird • Version: 3.0 • Zugriff über: Delphi
DB Firebird 3.0 wächst extrem
Hallo ich habe eine Datenbank mit Firebird 3.0 erstellt, wo ich nun zyklisch (5 Sekunden) Einträge in eine Log schreibe.
Die Logs werden aber nicht immer geinsert sondern, mit UPDATE OR INSERT geschrieben, in einen Ring Buffer. Also es gibt nur 1440 Einträge für das Log wo nach den 1440 Eintrag wieder bei eins angefangen wird. Also nach einer gewissen zeit werden nur mehr Updates gemacht. Das problem ist, das nun die Datenbank extrem wächst zum Teil. Das Backup ist gerade mal 2MB groß, im Moment ist die 300MB groß (nach ca. 2 Stunden lauf und Speichern der Index) vor kurzem hatte ich das Problem das sie 3GB groß war und mir der Speicherplatz ausging. Mir wäre es verständlich, wenn ich DELETE und INSERT mache jedesmal, aber mit primitiven UPDATES? ein weiter punkt ist, das ich alle 5 Sekunden ein UPDATE (in eine andere Tabelle) mache wo ich ein BLOB Feld aktualisiere mit 100kB ... was kann ich da noch optimieren? |
AW: DB Firebird 3.0 wächst extrem
Firebird ist eine Transactionsorientierte Datenbank , d.h. sie hält verschiedene Versionen der Datensätze bereit.
D.H. es mach keinen Unterschied ob Insert oder Update ,da das Update auch einen neuen Datensatz erstellt mit einen höheren Versions(transaction)-Zähler als der alte Das Problem so wie ich es sehe ist dass die Transactionen nicht committed werden (Commitretaining genügt nicht) dann werden die alten Versionen der Daten nicht freigegeben und die Sweep und Garbagecollection Mechanismen können die alten Daten nicht freigeben mfg Hannes |
AW: DB Firebird 3.0 wächst extrem
Also eigentlich mache ich immer ein Commit, ich habe einen Dienst der immer reinschreibt und nach den 5 sekunden dann auch das Commit macht.
Und andere Prozesse die daraus lesen Auch die Database Statisk schaut nicht shcelcht aus hätte ich gesagt (NExt Transaction und oc)
Code:
Database "D:\INTERBASE\MONITOR.FDB"
Database header page information: Flags 0 Generation 25109 System Change Number 0 Page size 8192 ODS version 12.0 Oldest transaction 25058 Oldest active 25059 Oldest snapshot 25059 Next transaction 25062 Sequence number 0 Next attachment ID 29 Implementation HW=AMD/Intel/x64 little-endian OS=Windows CC=MSVC Shadow count 0 Page buffers 0 Next header page 0 Database dialect 3 Creation date Aug 6, 2017 8:52:15 Attributes force write Variable header data: Sweep interval: 20000 *END* |
AW: DB Firebird 3.0 wächst extrem
Hallo,
und die anderen, lesenden Prozesse machen auch ein Commit? Mach doch mal ein Backup/Restore. Wenn die DB dann wieder klein ist, liegt es an den Transaktionen. |
AW: DB Firebird 3.0 wächst extrem
Ja mit Backup & Restore wirds wieder klein.
Eigentlich schon allerdings muss ich sagen,das ich gerade gemerkt habe,, das ich mit der IBConsole noch drauf war, und die hält eine Transaktion ja immer offen .... hab die mal geschlossen und schaue obs noch weiter wächst |
AW: DB Firebird 3.0 wächst extrem
Zitat:
|
AW: DB Firebird 3.0 wächst extrem
Es scheint Probleme mit der GC zu geben. Verringere einmal das Sweep-Intervall.
|
AW: DB Firebird 3.0 wächst extrem
Sweep Interval wird nicht helfen, wenn die Differenz zwischen Oldest und Next so gering bleibt, daher wenn das
eh so wenig Datensätze sind und du auf jeden Fall den commit machst, bau einfach mal ein regelmäßiges select count(*) from Tab in deine Anwendung ein, am besten in einer eigenen Transaktion. Dadurch werden dann auch garantiert die Pages durch die Garbage Collection aufgeräumt werden, in denen die gelöschten Recordversionen liegen und sobald möglich neu benutzt. |
AW: DB Firebird 3.0 wächst extrem
Ist der Effekt reproduzierbar? Tritt er nur auf wenn IBConsole geöffnet ist?
Da bei uns eine größere InterBase Installation im Einsatz ist die wir eventuell auf Firebird migrieren wollen, ist das Thema "offene Transaktionen" uns schon öfter begegnet, aber eine so schnell wachsende Datenbank bisher nicht (wir erzeugen bei einer Transaktionsdifferenz von über 20000 einen Alarm). |
AW: DB Firebird 3.0 wächst extrem
Das Problem ist vermutlich der Blob, der regelmässig aktualisiert wird ( = neue Version = neuer DS)
Für die Implementierung der Emulation eines Ringpuffers ist eine DBMS ( speziell ein auf Versionierung basierendes System) nicht so geeignet. Ein Delete mit neuem Insert wäre m.E. besser. Da hier dann die Datensätze sofort als gelöscht markiert werden und dann direkt Überschrieben werden können. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 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