Shrink Vergleich - Basic und SecureFile LOB

12.
Oktober
2023
Veröffentlicht von: Petr Novak

SecureFile LOB gibt es seit Oracle Version 11g. In der Version 21.3 kann man zum ersten Mal auch den Shrink durchführen. Der Datenbank-Parameter compatible muss dafür mindestens 20.0.0.0.0 sein. Im Test wollen wir Shrink Potential bei Basic LOBs und Securefiles bei unterschiedlichem Füllgrad und LOB Größen vergleichen. Die Performance wird nicht analysiert. Die Datenbank hat Version 21.3, Parameter compatible ist,21.0.0, Blockgröße  8K.
 

Wir wollen testen, ob man bei verschiedenen LOB Größen und bei verschiedenem Füllgrad der Segmente einen Unterschied in der Shrink Effektivität  sieht.  Eine weitere Frage ist: Hat die Lückenverteilung einen Einfluss im  LOB Segment?

Um eine generelle Tendenz besser erkennen zu können, wählen wir mehrere Kombinationen:

  • LOB Größe –  drei Varianten – 5KB, 10KB, 20KB.  Jede Tabelle beinhaltet mehrmals nur einen gleichen LOB Datensatz.
  • Lücken im Segment –  drei Varianten –   Wo werden die Daten auf Null gesetzt – am Segmentanfang , am Segmentende und  gleichmäßig über Segment verteilt 
  • Füllgrad des Segments vor dem Shrink – 3 Szenarios – es werden 25%, 50% und 75% der Werte auf Null gesetzt
     

Im Tabellennamen sieht man 

  • ob es der Basic LOB oder SecureFile ist (erste Buchstabe B oder S)
  • die LOB Größe  - Zahl 05 , 10 , oder 20 KB
  • wo wird die Lücke entstehen   - ANFANG, ENDE, VERTEILT


Als Beispiel:
B10_ANFANG -  beinhaltet Basic Lobs mit 10K Größe, dann Änderung am Segmentanfang  

S20_VERTEILT -  beinhaltet SecureFiles  mit 20K Größe , dann Änderung über Segment verteilt 
 

Die Tabellen mit 5K LOBs enthalten 16384 Sätze, Tabellen mit 10K LOBs 8192 Sätze und Tabellen mit 20K LOBs 4096 Sätze. 

Vorbereitung

Aus der Tabelle V$SQL_PLAN werden 3 OTHER_XML Werte mit der gewünschten Größe extrahiert und in der Tabelle T gespeichert.

select id,length(other_xml) from t;

           ID LENGTH(OTHER_XML)
-------------- -----------------
             1              5188
             2             10368
             3             20795


Bei jedem Test werden die Tabellen neu angelegt, Sätze geändert, Shrink und anschließend ein Alter Table Move durchgeführt.

Tabellen werden wie folgt angelegt:

alter session set db_securefile=ALWAYS;

create table S05_ANFANG (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=1 and rownum<=32768;
create table S05_VERTEILT (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=1 and rownum<=32768;
create table S05_ENDE (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=1 and rownum<=32768;

create table S10_ANFANG (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=2 and rownum<=16384;
create table S10_VERTEILT (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=2 and rownum<=16384 ;
create table S10_ENDE (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=2 and rownum<=16384;

create table S20_ANFANG (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=3 and rownum<=8192 ;
create table S20_VERTEILT (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=3 and rownum<=8192 ;
create table S20_ENDE (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=3 and rownum<=8192;

alter session set db_securefile=NEVER;

create table B05_ANFANG (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=1 and rownum<=32768;
create table B05_VERTEILT (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=1 and rownum<=32768;
create table B05_ENDE (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=1 and rownum<=32768;

create table B10_ANFANG (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=2 and rownum<=16384;
create table B10_VERTEILT (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=2 and rownum<=16384;
create table B10_ENDE (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=2 and rownum<=16384;

create table B20_ANFANG (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=3 and rownum<=8192;
create table B20_VERTEILT (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=3 and rownum<=8192 ;
create table B20_ENDE (id,other_xml) as select rownum,other_xml from dba_objects , t where t.id=3 and rownum<=8192;

 

Szenarios

1)  25% der Sätze wurden auf Null gesetzt

Beispiel für Basic Lobs, ähnlich wird es bei SecureFiles durchgeführt.

update B05_ANFANG set other_xml=null where id<=8192;
update B05_VERTEILT set other_xml=null where mod(id,4)=0;
update B05_ENDE set other_xml=null where id>32768-8192;

update B10_ANFANG set other_xml=null where id<=4096;
update B10_VERTEILT set other_xml=null where mod(id,4)=0;
update B10_ENDE set other_xml=null where id> 16384-4096;

update B20_ANFANG set other_xml=null where id<=2048;
update B20_VERTEILT set other_xml=null where mod(id,4)=0;
update B20_ENDE set other_xml=null where id> 8192-2048;

 

2)  50% der Sätze wurden auf Null gesetzt

Beispiel für Basic Lobs, ähnlich wird es bei SecureFiles durchgeführt.

update B05_ANFANG set other_xml=null where id<=16384;
update B05_VERTEILT set other_xml=null where mod(id,4)=0;
update B05_VERTEILT set other_xml=null where mod(id,4)=1;
update B05_ENDE set other_xml=null where id>32768-16384;

update B10_ANFANG set other_xml=null where id<=8192;
update B10_VERTEILT set other_xml=null where mod(id,4)=0;
update B10_VERTEILT set other_xml=null where mod(id,4)=1;
update B10_ENDE set other_xml=null where id> 16384-8192;

update B20_ANFANG set other_xml=null where id<=4096;
update B20_VERTEILT set other_xml=null where mod(id,4)=0;
update B20_VERTEILT set other_xml=null where mod(id,4)=1;
update B20_ENDE set other_xml=null where id> 8192-4096;

 

3)  75% der Sätze wurden auf Null gesetzt

Beispiel für Basic Lobs, ähnlich wird es bei SecureFiles durchgeführt.

update B05_ANFANG set other_xml=null where id<=16384+8192;
update B05_VERTEILT set other_xml=null where mod(id,4)=0;
update B05_VERTEILT set other_xml=null where mod(id,4)=1;
update B05_VERTEILT set other_xml=null where mod(id,4)=2;
update B05_ENDE set other_xml=null where id>32768-16384-8192;

update B10_ANFANG set other_xml=null where id<=8192+4096;
update B10_VERTEILT set other_xml=null where mod(id,4)=0;
update B10_VERTEILT set other_xml=null where mod(id,4)=1;
update B10_VERTEILT set other_xml=null where mod(id,4)=2;
update B10_ENDE set other_xml=null where id> 16384-8192-4096;

update B20_ANFANG set other_xml=null where id<=4096+2048;
update B20_VERTEILT set other_xml=null where mod(id,4)=0;
update B20_VERTEILT set other_xml=null where mod(id,4)=1;
update B20_VERTEILT set other_xml=null where mod(id,4)=2;
update B20_ENDE set other_xml=null where id> 8192-4096-2048;

 

Reorganisation

Es werden Standardbefehle verwendet, wie zum Beispiel:

Shrink:  alter table B05_ANFANG modify lob(other_xml) (shrink space cascade);
Move:  alter table S20_ENDE  move lob(other_xml) store as (tablespace USERS);

 

Auswertung

LOB Größen nach dem Anlegen, nach dem Shrink und nach dem Move für alle 3 Szenarios im Überblick:
 

                             25%                50%                  75%
Tabelle               MB   Shrink Move    MB   Shrink Move     MB  Shrink  Move
-------------------- ----   ----  ----   ----   ----  ----    ----  ----   ----
B05_ANFANG            516    516   392    515    263   264     519   129    136
B05_ENDE              522    522   392    520    515   260     516   258    136
B05_VERTEILT          519    519   392    520    515   259     521   172    136
B10_ANFANG            389    389   291    392    199   200     391    97    104
B10_ENDE              390    390   291    388    386   200     392   194    104
B10_VERTEILT          390    390   296    393    386   200     388   129    104
B20_ANFANG            394    394   296    392    199   200     392    97    104
B20_ENDE              391    391   296    392    386   200     392   194    104
B20_VERTEILT          392    392   296    392    386   200     390   129    104
S05_ANFANG            568    449   392    568    313   264     568   161    136
S05_ENDE              576    529   392    576    401   264     568   177    136
S05_VERTEILT          568    521   392    568    377   264     568   177    136
S10_ANFANG            432    432   296    432    432   200     432   432    104
S10_ENDE              432    401   296    432    217   200     432   121    104
S10_VERTEILT          432    345   296    432    249   200     432   169    104
S20_ANFANG            432    432   296    432    432   200     432   432    104
S20_ENDE              432    432   296    432    432   200     432   121    104
S20_VERTEILT          432    297   296    432    432   200     432   193    104

Nach dem Ändern der 25% der Sätze hat Shrink bei Basic LOBs gar nichts gebracht, bei 50% war nur bei den B*ANFANG Tabellen wirksam.
Nach dem Ändern der 75% der Sätze wurden alle Basic Lobs verkleinert, Platzersparnis war aber von der Verteilung der Lücken abhängig - am besten haben die B*ANFANG Tabellen abgeschnitten.
Bei den SecureFiles hat schon bei 25% der Lücken der Shrink teilweise funktioniert, anderseits bei den Tabellen S10_ANFANG und S20_ANFANG hat es auch bei 75% der Lücken nicht funktioniert.
Unklar ist, warum Shrink der S20_VERTEILT Tabelle nur mit 50% nicht funktioniert hat.
 

Fazit

Das Testergebnis war nicht eindeutig, man kann nicht sagen, welcher LOB Typ sich besser mit Shrink reorganisieren lässt. Eine generelle Tendenz konnte man im Test nicht feststellen.
Bei 25% der Lücken konnte man SecureFiles besser mit Shrink verkleinern, dagegen bei 75% der Lücken wurden 2 SecureFiles nicht verkleinert.  

Die Lückenverteilung hatte bei beiden LOB Varianten großen Einfluss auf die Shrink Effektivität. 
Wegen dem unsicheren Erfolg beim Shrink sollte man lieber (falls möglich) Alter Table Move Lob durchführen.
 

 

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.