Oracle Database Tablo Sıkıştırma – Table Shrink

Değerli Dostlar,

Biz veri tabanı yöneticileri olarak veri tabanımız üzerinde en çok efor sarf ettiğimiz konulardan bir tanesi sürekli insert , update yada delete alan tablolarda oluşan boyut problemleridir. Oracle veri tabanı mimarisi gereği bir tabloda oluşan DML işlemlerinde eklenen verilerde tablo sürekli büyür fakat silinen veri olursa tabloyu küçülmez, bunun yerine oluşan fragmantasyondan dolayı ilgili tabloda siz ne kadar veri silsenizde blok kaldığı yerden yazmaya devam edeceği için tablo boyutunun her halukarda büyüyeceğidir.

Oracle tablolarda SQL sorgularındaki cost değeri hesaplamak yada mevcut tabloya full table scan bir sorgu geldiğinde hangi veri bloğuna kadar okuyacağını anlamak için High Water Mark isimli özelliği kullanır. Bir tablo ilk defa oluşturulduğunda HWM otomatik olarak bir başlangıç değeri atar ve her insert işleminde bu değer yükselir.Aşağıdaki örnekte görüldüğü gibi tablo insert almaya devam ettikçe pointer otomatik olarak yükselecek ve tabloda buna bağlı olarak değişimler oluşacaktır. Delete işleminde ise mantık olarak bu pointer noktasının düşmesi gerekirken Oracle mimarisi gereği düşmemektedir.

Bu pointer noktasının aynı yerde kalması öncelikli olarak sistem üzerinde gereksiz I/O yaptıracak ve sorgu performansını kötü bir şekilde etkileyerek aynı zamanda disk üzerinde gereksiz bir alan işgal edilmesini sağlayacaktır. Bir tabloda delete işlemi olmasına rağmen neden boyutun küçülmediği anladığımıza göre yazımıza devam edebiliriz.

Shrink edilecek tablolarda dağılmış olan blokların bir araya getirilmesi ve bu sayede tablo boyutlarının küçültülmesi için bilmemiz gereken bazı önemli durumlar mevcut.

  • Compress özelliği olan bir tablo shrink edilemez. Tablo önce nocompress duruma alınmalı shrink işlemi gerçekleştikten sonra tekrar compress özelliği aktif edilmelidir. Eğer compress özelliği olan bir tabloda shrink yaparsanız ORA-10635: Invalid segment or tablespace type hatası alırsınız.
  • Tabloda row movement özelliğinin enable edilmesi gerekir.
  • Bir tablo shrink edilirken Lock edilir, bundan dolayı tabloda ile ilişkili olan durumlarda wait oluşur.

Shrink için işlemlere başlayabilir.

SQL> alter table TBL_LOKUM enable row movement
Table altered

Tablomuzda row movement özelliğini aktif ettik. Şimdi işlerimizin kolaylaşması için basit bir sorgu ile fragmente olan tabloları bulalım ve listeleyelim.

SELECT DISTINCT owner ownr,
                ‘alter table ‘
                                || owner
                                ||’.’
                                || segment_name
                                || ‘ shrink SPACE CASCADE;’ seg_name, segment_type seg_type, tablespace_name tbs_name, file_id dbf_number FROM dba_extents WHERE (
  (
    block_id + 1
  )
  *
  (
         SELECT value
         FROM   v$parameter
         WHERE  upper (name) = ‘db_block_size’) + bytes
)
> (10000 * 1024 * 1024)
AND
segment_type = 'table'
AND
owner = 'ABUZER'

--Sorgu çıktısı --

OWNR SEG_NAME SEG_TYPE TBS_NAME DBF_NUMBER
Alter table ABUZER.TBL_LOKUM shrink space cascade;

Fragmente olan ve shrink edeceğimiz tablolar listelendi. Şimdi shrink işlemine başlayabiliriz.

SQL> alter table ABUZER.TBL_LOKUM shrink space cascade;
Table altered.

Eğer tablomuzda Compress açık halde ise bu adımları yapmanız gerekir.

SQL> alter table TBL_LOKUM enable row movement;
Table altered

SQL> alter table ABUZER.TBL_LOKUM nocompress;
Table altered.

SQL> alter table ABUZER.TBL_LOKUM shrink space cascade;
Table altered.

SQL> alter table ABUZER.TBL_LOKUM compress;
Table altered.

Bu yazımızda Oracle veri tabanında bulunan tabloların nasıl küçültüleceğini anlattık. Yeni yazılarımızda görüşmek dileğiyle.

Facebook Yorum