![]() |
Datenbank: Firebird • Version: 2.1 • Zugriff über: IBExpert
[Firebird 2.1] Statement zu einer offenen Transaktion finden
Ich habe hier eine Firebird-DB, die mit der Zeit immer langsamer wird. Nach und nach kristallisiert sich heraus, das offene Transaktionen dafür verantwortlich sind. Nun gibt es seit FB 2.1 diese tollen MON$-Tabellen, mit denen man ziemlich viel über den aktuellen Zustand von FB heraus bekommt.
Frage: Wie bekomme ich alle Statements zu einer bestimmten Transaktion heraus? Geht das mit den MON$-Tabellen? |
Re: [Firebird 2.1] Statement zu einer offenen Transaktion fi
mit IBExpert den Menüpunkt services-database monitoring öffnen und nachschauen (leider nur in der vollversion :-)
wenn du MON$ATTACHEMNTS, MON$STATEMENTS und MON$ATTACHEMENTS öffnest sind die aber auch so relativ selbsterklärend, jedenfalls ide wichtigen Teile. und ein Blick in die Firebird 2.1 Releasenotes klärt auch den Rest auf :-) |
Re: [Firebird 2.1] Statement zu einer offenen Transaktion fi
Toll, danke... Falls ich nicht weiterkomme, trudelt ne Bestellung für die VV ein.
|
Re: [Firebird 2.1] Statement zu einer offenen Transaktion fi
Um solche Schlawiner rauszufinden setze ich ab & zu das unten ab.
Die "Abfrage" gibt dir oben die älteste aktive Transaktion und zu jeder Transaktion den host, prozessname, user, etc. Alles schön untereinander, so dass man nicht wie blöde nach links und rechts scrollen muss. ;-)
SQL-Code:
execute block
returns ( Kind varchar(30), ID bigint, Time_Stamp timestamp, Data blob sub_type text, State integer ) as declare userName varchar(256); declare dbName varchar(256); declare tid bigint; declare aid bigint; begin for select mon$timestamp, mon$state, mon$transaction_id, mon$attachment_id from mon$transactions t -- where -- mon$transaction_id = t.mon$oldest_active order by case when mon$transaction_id = t.mon$oldest_active then 0 else 1 end, mon$transaction_id into :Time_Stamp, :State, :ID, :AID do begin Data = null; Kind = 'Transaction'; suspend; TID = ID; for select trim(mon$remote_address) ||' -> '|| trim(mon$remote_process), mon$remote_pid, mon$user, mon$attachment_name from MON$ATTACHMENTS where mon$attachment_id = :AID into :Data, :ID, :userName, :dbName do begin State = null; Kind = 'Process'; suspend; ID = null; Kind = 'Database'; Data = dbName; suspend; Kind = 'User'; Data = userName; suspend; Kind = 'Statement'; for select mon$statement_id, mon$timestamp, mon$sql_text, mon$state from MON$STATEMENTS where mon$transaction_id = :tid and mon$attachment_id = :aid into :ID, :Time_Stamp, :Data, :State do suspend; end end end |
Re: [Firebird 2.1] Statement zu einer offenen Transaktion fi
Hallo,
irgendwie kann ich den Menüpunkt: service-Database monotoring nicht finden. Ich besitze eine gekaufte Version, oder ist dieser Menüpunkt erst in einer neuern IBExpert-Version vorhanden? Bis bald Chemiker |
Re: [Firebird 2.1] Statement zu einer offenen Transaktion fi
Zitat:
|
Re: [Firebird 2.1] Statement zu einer offenen Transaktion fi
Hallo IBExpert,
ist damit gemeint die Serverversion: Firebird 2.1? Bis bald Chemiker |
Re: [Firebird 2.1] Statement zu einer offenen Transaktion fi
Zitat:
|
Re: [Firebird 2.1] Statement zu einer offenen Transaktion fi
Hallo IBExpert,
danke, hat funktioniert Menü-Punkt gefunden. Bis bald Chemiker |
Re: [Firebird 2.1] Statement zu einer offenen Transaktion fi
Hi,
Erfolgsmeldung :dancer2: Die Tipps aller und speziell die Query von Elvis haben mir geholfen. Ich verwende dbExpress und habe einige TSQLQuerys offen gehalten. Die habe ich durch TSimpleDataset ersetzt, wobei ich noch nach dem Einlesen der Daten die interne Connection wieder geschlossen habe. Anschließend hatte ich 0-2 aktive Transaktionen, anstatt 6 (und einem Uralt-Übeltäter) Hintergrund: Zwischengespeicherte Messwerte müssen an einen Client übertragen werden. Manchmal isser da, manchmal eben nicht. Wenn er nicht da ist, werden die Daten in einer FB-DB gepuffert. Nun teste ich den Extremfall, das der Client nach einigen Tagen erst wieder online und die DB in der Zwischen auf 500MB angeschwollen ist. Ich lese also jeweils 10000 Messwerte aus der DB ein und schicke diese in Häppchen à 70 Stück (Limitierung des Clients) mit XML an den Client. Diese 10000er TSQLQuery war aber die ganze Zeit offen (klar, ich muss ja alle Daten verschicken). Die Messapplikation hat aber in der Zwischenzeit kräftig neue Messergebnisse fabriziert und diese in die DB geschrieben. Und genau diese Schreiboperation wurde immer langsamer, da obige (TSQLQuery)-Transaktion offen war. So erkläre ich mir das jedenfalls. Was ich allerdings 'gewöhnungsbedürftig' finde, ist die Tatsache, das eine Query offensichtlich eine Transaktion öffnet. Aber gut, wenn das so ist. PS: Ein sehr hübsches Monitoring-Tool ist von ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23: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