News zu Oracle

DBA Tipp: Ta­b­le­space­frei­platz und Buffer Cache Hit Ratio erhöhen durch De­frag­men­tie­rung von Tabellen

Nach größeren Lösch­ope­ra­tio­nen entstehen Lücken in Da­ten­blö­cken, die sich negativ auf Per­for­mance und Platz­be­le­gung auswirken. Werden sie in der Tabelle nicht zeitnah durch neue Daten auf­ge­füllt, empfiehlt sich ein Online-Shrink der be­trof­fe­nen Tabellen. Ein Ansatz zur Ab­schät­zung stark frag­men­tier­ter Tabellen wird in diesem DBA-Tipp vorgestellt.

Logo Oracle Database

Warum überhaupt defragmentieren?

Das Löschen einer größeren Menge von Zeilen aus einer Tabelle führt in aller Regel dazu, dass die Da­ten­blö­cke der Tabelle stark frag­men­tiert werden. Das heißt es gibt dann also viele Blöcke, die nur wenige Daten enthalten. Diese Frag­men­tie­rung hat zwei we­sent­li­che Nachteile:

  • Ver­schwen­dung von Spei­cher­platz, wenn die Lücken nicht im Laufe der Zeit wieder durch neue Zeilen gefüllt werden. Da der Freiplatz fest von einer be­stimm­ten Tabelle allokiert ist, steht er auch keinen anderen Objekten in der Datenbank zur Verfügung.

  • Auch wenn der Platz nach und nach wie­der­ver­wen­det wird, wirkt sich diese Frag­men­tie­rung bis dahin negativ auf die Per­for­mance aus. Der Buffer Cache der Datenbank, eine der wich­tigs­ten Kom­po­nen­ten im Bezug auf Da­ten­bank­per­for­mance, arbeitet rein block­ba­siert. Folglich ver­schwen­den Da­ten­blö­cke einer Tabelle Platz im Buffer Cache, wenn sie frag­men­tiert sind, da auch der leere Anteil im Block auf den Buffer Cache an­ge­rech­net wird. Die „Nutz­da­ten­ra­te“ ist damit schlech­ter als bei un­frag­men­tier­ten Blöcken, die Per­for­mance sinkt durch eine geringere Buffer Cache Hit Ratio.

Es kann also nach größeren Lösch­ope­ra­tio­nen in­ter­es­sant sein, welche Tabellen mittels:

alter table … shrink space cascade;

geshrinkt werden können, um zum einen un­be­leg­ten Platz frei­zu­ge­ben und zum anderen die Buffer Cache Effizienz hoch zu halten. Dafür kannst du dir zwei Ta­bel­len­sta­tis­ti­ken zu Nutze machen – die Zei­len­zahl und die durch­schnitt­li­che Zei­len­län­ge – und diese mit der tat­säch­li­chen Platz­be­le­gung in Bezug setzen. Es ist zu beachten, dass es sich dabei nicht um exakte Werte handelt. Wenn die Sta­tis­ti­ken jedoch aktuell sind, stellen sie für diesen Zweck recht zu­ver­läs­si­ge Schät­zun­gen dar. Grund­sätz­lich kannst du davon ausgehen, dass Tabellen, in denen große Da­ten­men­gen gelöscht wurden, auch vom nächt­li­chen Autotask „auto optimizer stats coll­ec­tion“ erkannt und ana­ly­siert wurden. An­dern­falls rechnest du mit ge­eig­ne­ten Pro­ze­du­ren des dbm­s_stats-Package die Sta­tis­ti­ken einfach selbst neu.

Vergleich er­war­te­ter Platz­be­darf und tat­säch­lich belegter Platz

Zur Ab­schät­zung des Platzes, den wir durch das Shrinken vor­aus­sicht­lich einsparen, stellen wir nun einen Vergleich zwischen dem er­war­te­ten Platz­be­darf (Zei­len­zahl * durch­schnitt­li­che Zei­len­län­ge) und dem tat­säch­lich belegten Platz (Summe der Seg­ment­grö­ßen) an:

WITH table_subset AS
( SELECT owner,table_name
FROM dba_tables
WHERE owner='SOE'
)
SELECT exp.owner,
exp.table_name,
ROUND((used_space-expected_space)/power(1024,2)) estimated_savings_mb,
used_space,
expected_space,
ROUND((1-expected_space/used_space)*100) estimated_savings_pct
FROM
(SELECT owner,
table_name,
num_rows*avg_row_len expected_space
FROM dba_tables t
WHERE (owner,table_name) IN
(SELECT * FROM table_subset s)
AND num_rows IS NOT NULL
AND avg_row_len IS NOT NULL
) exp,
(SELECT owner,
segment_name,
SUM(bytes) used_space
FROM dba_segments
WHERE (owner,segment_name) IN
(SELECT * FROM table_subset s)
GROUP BY owner,
segment_name
HAVING SUM(bytes)>0
) used
WHERE exp.owner =used.owner
AND exp.table_name=used.segment_name
ORDER BY estimated_savings_mb DESC

Wie wir sehen, hat in unserem Beispiel die Tabelle SOE.ORDER_ITEMS ein Ein­spa­rungs­po­ten­zi­al von ca. 1.1GB. Sie belegt aktuell 1.4 GB Platz, obwohl sie gemäß ihrer Sta­tis­ti­ken nur 209 MB belegen müsste. Wir können sie also als einen ge­eig­ne­ten Kan­di­da­ten für eine Online-Shrink-Operation ansehen:

ALTER TABLE SOE.ORDER_ITEMS ENABLE ROW MOVEMENT;
ALTER TABLE SOE.ORDER_ITEMS SHRINK SPACE CASCADE;

Eine erneute Aus­wer­tung zeigt, dass die Tabelle, wie erwartet, ihren un­ge­nutz­ten Platz frei­ge­ge­ben hat. Im Ta­b­le­space stehen nun 1.1GB mehr Platz zur freien Verfügung.

Am Beginn des SELECT-State­ments findest du die Inline-View

WITH table_subset AS
( SELECT owner,table_name
FROM dba_tables
WHERE owner='SOE'
)

Hierüber kannst du ein­stel­len, welche Tabellen in die Be­trach­tung ein­be­zo­gen werden sollen. Wir be­schrän­ken uns hier zum Beispiel auf das Schema SOE. Eine Aus­wer­tung über alle Tabellen einer Datenbank dürfte meist zu lange dauern und auch nur selten er­for­der­lich sein. So ist zum Beispiel das Shrinken von SYS-Objekten ohnehin nicht empfohlen und in vielen Fällen auch nicht möglich.

Fazit

Größere Lösch­ope­ra­tio­nen führen häufig zu Frag­men­tie­rung in Oracle-Tabellen – mit negativen Aus­wir­kun­gen auf Spei­cher­platz und Per­for­mance. Der vor­ge­stell­te Ansatz er­mög­licht es dir als DBA, stark frag­men­tier­te Tabellen sys­te­ma­tisch zu iden­ti­fi­zie­ren und gezielt per Online-Shrink zu op­ti­mie­ren. So lassen sich un­ge­nutz­te Reserven im Ta­b­le­space freigeben und die Effizienz des Buffer Caches nach­hal­tig verbessern.

Hier findest du weitere Infos rund um Oracle aus unserem News & Insights Bereich.

icon-arrow_right_medium-violet-blue.svg

Share this article

Facebook 
Twitter 
LinkedIn 
XING 
WhatsApp 
Email