Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Updates eines CLOB Feldes belegen unerwartet viel Datenträgerplatz (Oracle) (https://www.delphipraxis.net/212486-updates-eines-clob-feldes-belegen-unerwartet-viel-datentraegerplatz-oracle.html)

mjustin 16. Feb 2023 13:56

Datenbank: Oracle • Version: 19c • Zugriff über: JDBC

Updates eines CLOB Feldes belegen unerwartet viel Datenträgerplatz (Oracle)
 
Umgebung:

* Betriebssystem Windows 2016 Server
* DBMS Oracle 19c
* Oracle Tablespaces mit max. 11 GB angelegt
* Zugriff über JDBC

Die Anwendung schreibt ein Protokoll in eine Oracle Datenbank, sie trägt dazu dazu per SQL UPDATE immer wieder einen längeren Text in ein und dasselbe CLOB Feld ein. (also beim ersten Update ist der Text eine Zeile, lang, beim zweiten Update zwei Zeilen, usw.).

Das Protokoll kann einige wenige MB lang sein, es gibt in einem Lauf bis zu fünfhunderttausend Aktualisierungen des Felds.

Erwartung:
* der Tablespace sollte durch die Protokollierung nicht erheblich mehr Platz auf dem Datenträger belegen, als das Protokoll lang ist.

Problem:
* der belegte Platz auf dem Datenträger wächst während der Ausführung um mehrere Gigabyte an
** der belegte Platz ist eindeutig nur von der Tabelle belegt, die das CLOB Feld enthält
** es gibt nur einen einzigen Datensatz in dieser Tabelle, der aktualisiert wird

Vermutung:
* Oracle belegt bei jedem Update einen neuen Bereich auf dem Datenträger, speichert dort den neuen Wert, und gibt den Bereich mit dem vorherigen Wert nicht frei.

Ist das ein bekanntes "Feature" bei Oracle Datenbanken, das man konfigurieren kann, oder deutet das eher auf einen Fehler in der Installation hin?

mkinzler 16. Feb 2023 14:01

AW: Updates eines CLOB Feldes belegen unerwartet viel Datenträgerplatz (Oracle)
 
Oracle kann verschiedene Transaktionssysteme. Neben dem klassischen Transaktionslog wird auch Multiversion Concurrency Control unterstützt.
Bei dieser datenbank/Tabelle scheint dies aktiviert zu sein.
Bei einem Commit sollte der Speicherplatz aber dann durch nachfolgenden Updates Datensätzen genutzt werden. Läuft alles in einer Tranaktion ab?

mjustin 16. Feb 2023 14:11

AW: Updates eines CLOB Feldes belegen unerwartet viel Datenträgerplatz (Oracle)
 
Zitat:

Zitat von mkinzler (Beitrag 1518767)
Oracle kann verschiedene Transaktionssysteme. Neben dem klassischen Transaktionslog wird auch Multiversion Concurrency Control unterstützt.
Bei dieser datenbank/Tabelle scheint dies aktiviert zu sein.
Bei einem Commit sollte der Speicherplatz aber dann durch nachfolgenden Updates Datensätzen genutzt werden. Läuft alles in einer Tranaktion ab?

Multiversion Concurrency Control prüfe ich, vielen Dank für den Hinweis.

Ja, Transaktionen werden verwendet, allerdings sollte nach einem Abbruch (rollback) oder einem sauberen Ende (commit) der Anwendung der zwischendurch temporär belegte Speicher des Tablespace 'eigentlich' freigegeben werden. Er ist dann aber nicht mehr nutzbar. Nur ein truncate auf die Tabelle hilft anscheinend.

smallie 16. Feb 2023 14:48

AW: Updates eines CLOB Feldes belegen unerwartet viel Datenträgerplatz (Oracle)
 
Zitat:

Zitat von mjustin (Beitrag 1518769)
Nur ein truncate auf die Tabelle hilft anscheinend.

Hmm. Könnte die High Water Mark sein.

Schon mal damit probiert?

Zitat:

-- Shrink a LOB segment (basicfile only until 21c).
ALTER TABLE table_name MODIFY LOB(lob_column) (SHRINK SPACE);
ALTER TABLE table_name MODIFY LOB(lob_column) (SHRINK SPACE CASCADE);

https://oracle-base.com/articles/mis...k-space-online


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz