Not : Yazılar Yaşar İslam’a aittir. İzni ile sayfamızda paylaşılmaktadır. Yazar tanıtım resmi için bunun görülen resim yazıyı yayına hazırlayan kişiye aittir. İletişim kurduğunuzda geri dönüş alabilmeniz için.

Merhabalar yavaş yavaş ilerliyoruz 5. dersimizdeyiz. Bu yazımda sizlere Oracle’da Shrink operasyonunu anlatmaya çalışacağım.

Veritabanımızdaki tablolar üzerinde sürekli insert, delete işlemi olduğu zaman tablo fragmantasyona uğrar.Bunun sonucunda da size’ları olması gerektiğinden büyük olurlar.Çünkü delete işlemi tabloda yer açmaz, silinen blogun üzerine yazılmaz bir sonraki data bloga yazılır. Delete sorgularında  High Water Mark geri gelmez (high water mark için daha ayrıntılı bilgiyi 4 Oracle’da High Water Mark Kavramı isimli yazımdan okuyabilirsiniz).

Bir tane örnek ile konuyu anlatmaya çalışayım.

Öncelikle bir tablo oluşturalım.

SQL> create table shrink_test

     as      

     select * from user_tables;    

     Table created.

SQL> select count(*) from shrink_test;   
     COUNT(*)
     ———-
     955
SQL> insert into shrink_test    

 

select * from shrink_test;

         

955 rows inserted.
 

SQL> insert into shrink_test

select * from shrink_test;



1910 rows inserted.



SQL> insert into shrink_test
select * from shrink_test;
3820 rows inserted.


SQL> begin

for i in 1 .. 10

loop
insert into shrink_test

select * from shrink_test;

commit;
end loop;

end;
 

SQL> select count(*) from shrink_test;
 
     COUNT(*)
     ———
     983574
shrink_test tablomuzun size’ına bakalım şimdi.
SQL> select segment_name, bytes/1024/1024 mb from dba_segments
     where segment_name = ‘SHRINK_TEST’;
SEGMENT_NAME   MB
———————–
SHRINK_TEST    272







Şimdi tablomuzdaki tüm dataları silelim.



SQL> DELETE FROM SHRINK_TEST;



SQL> select count(*) from shrink_test;



     COUNT

     —–

       0

                




SQL> select segment_name, bytes/1024/1024 mb from dba_segments
     where segment_name = ‘SHRINK_TEST’;

 


 

SEGMENT_NAME   MB

 

———————–

 


SHRINK_TEST    272



Gördüğünüz gibi tablodaki tüm data’ları sildik ama yine boyutu 272 mb olarak gözüküyor.Bu tip problem karşısında shrink, export – import, move table vs. gibi yöntemlerden biri olan shrink ‘ i ele alalım.



Shrink işlemi tablonun kullanmış olduğu blokları reorganize ederek dağınıklığı gideren dolayısıylada olması gerektiği kadar blok kullanılmasını sağlayarak disk üzerinde yer kazanmanızıda sağlayan bir işlem olarak tanımlayabiliriz.



Shrink işlemi data’nın fiziksel olarak bulunduğu data bloğu yer değiştireceği için öncelikli olarak row movement özelliğini enable yapmamız gerekiyor.



SQL> alter table  SHRINK_TEST  enable row movement;

Table altered.



SQL> alter table SHRINK_TEST shrink space cascade;

Table altered.



       Eğer ORA-10635: Invalid segment or tablespace type hatasını alırsanız ;

       Tabloyu compress moddan çıkartıp tekrar deneyelim.

      

        SQL> alter table SHRINK_TEST nocompress;

    Table altered.



    SQL> alter table SHRINK_TEST shrink space cascade;

    Table altered.



        SQL> alter table SHRINK_TEST compress;

    Table altered.



Sonra row movement özelliğini disable yapalım.



SQL> alter table SHRINK_TEST disable row movement;

Şimdi terkaradan tablonun boyutuna bakalım.


SQL> select segment_name, bytes/1024/1024 mb from dba_segments

 

     where segment_name = ‘SHRINK_TEST’;

 


     SEGMENT_NAME    MB

    —————————

     SHRINK_TEST    0,0625



İşte bu kadardı arkadaşlar. Umarım faydalı olmuştur. Bir sonraki dersimizde görüşmek üzere.


Yaşar İslam

Facebook Sayfamizdan Bizleri Takip Edebilirsiniz
Murat Bilginer

Industryolog Akademi Founder – Endüstri Mühendisi
Canias ERP Troia Geliştiricisi & Yazılım Uzmanı
7 Yıldır bildiğini paylaşmak için çabalayan bir blogger.

http://muratbilginer.net/