Oracle’ da Shrink Operasyonu Nedir / Nasıl Yapılır ... - Kamil TÜRKYILMAZ | Oracle BlogKamil TÜRKYILMAZ | Oracle Blog
Oracle’ da Shrink Operasyonu Nedir / Nasıl Yapılır …
— öncelikle test tablomuzu oluşturup tablo üzerinde delete – insert – … işlemleri ile tablo üzerinde fragmantasyon oluşmasını sağlamaya çalışalım ;
SQL> create table test as select * from dba_objects
SQL> insert into test select * from test
69488 rows created.
138976 rows created.
277952 rows created.
555904 rows created.
SQL> analyze table test estimate statistics
Tablodaki kayıt sayısını kontrol edelim;
Şu anki durumdaki size’ ına bakalım;
SQL> select segment_name, bytes/1024/1024 mb from dba_segments where segment_name = ‘TEST’
1.1 milyon adet datammızın şu anki toplam size’ i 128 MB devam edelim;
SQL> delete test where rownum < 500000 499999 rows deleted. SQL> insert into test select * from test
611809 rows created.
SQL> delete test where rownum < 500000 499999 rows deleted. SQL> commit
723619 rows created.
Yine bir miktar ekleyip çıkarma işleminden son durumdaki datamızı count edelim;
Son durumdaki size’ ına bakalım ;
Toplam data büyüklüğümüz 1.4 milyona ulaşmış, tablomuzun size’ i ise 232 MB olmuş. Dikkat ederseniz data miktarı % 27 büyürken tablonun toplam size’ indaki artış % 80 lerde gerçekleşmiş. Devam edelim;
947239 rows created.
Tablodaki tüm datayı siliyoruz;
SQL> delete test
1894478 rows deleted.
Tüm datanın silindiğini teyit edelim;
Tablomuzda hiçbir kayıt yokken tablonun size’ i 232 MB olarak kaldı.
İşte anlatılmak istenen durumda tam bu idi. Tabloda yer kazanmak istiyorsanız yapmanız gereken işlem delete değil truncate veya drop – create gibi yöntemler olmalıdır. Uygulamanızın yapısı gereği drop – create veya truncate – insert gibi yöntemleri kullanamıyorsanız o zaman tablonuz üzerinde belirli dönemlerde oluşan bu tarz fragmantasyonları gidermek için shrink, export – import, move table – rebuild index vs … gibi yöntemlere başvurmanız gerekecektir. Daha önce tabloların move edilip sonrasında indexlerin nasıl rebuild edilmesi gerektiğinden bahsetmiştim. (http://www.kamilturkyilmaz.com/2010/10/25/tablo-ve-indexlerin-tasinmasi/ )
Aynı şekilde tablolar üzerindeki lob ssegmentler üzerinde move rebuild işlemlerinin nasıl yapılması gerektğindede http://www.kamilturkyilmaz.com/2011/02/25/lobindex-ve-lobsegment%E2%80%99-lerin-create-move-rebuild-edilmesi/ başlıklı yazımda değinmiştim.
Bugün shrink işleminden bahsetmek istiyorum ;
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 ;
Nasıl yapacağımız ile ilgili olarak ;
Shrink işlemi datanın fiziki olarak da yerini (yer aldığı blok’ u değiştirdiğinden) değiştirdiğinden dolayı tablonun row movement özelliğini öncelikle enable etmemiz gerekiyor;
SQL> alter table test enable row movement
Tablolardaki fragmantasyonu saptamak için kolaylık olması açısından aşağıdaki sql’ ide kullanabilrisiniz ;
SELECT DISTINCT owner ownr,
‘Alter table ‘ || owner ||’.’|| segment_name || ‘ shrink space cascade;’ seg_name,
WHERE ( (block_id + 1)
* (SELECT VALUE
WHERE UPPER (name) = ‘DB_BLOCK_SIZE’) + BYTES) > (10000 * 1024 * 1024)
and owner = ‘KAMIL’
OWNR	SEG_NAME	SEG_TYPE	TBS_NAME	DBF_NUMBER
KAMIL	Alter table KAMIL.TEST shrink space cascade; TABLE	DATA 1
SQL> alter table kamil.test shrink space cascade
Tabloyu shrink ettikden sonra size’ ini tekrar kontrol edelim;
SQL> alter table test disable row movement
Shrink işlemi ile ilgili önemli bir not;
Compress tablo üzerinde shrink işlemi yapamazsınız, compress şeklinde kullanmakta olduğunuz tablolarınız var ise bunlarda shrink işlemi yapmak istiyorsanız öncelikle tabloyu nocompress edip shrink işleminden sonra tekrar compress hale getirerek yapmalısınız ;
SQL> alter table kamil.test compress
Shrink etmeye çalışalım ;
alter table kamil.test shrink space cascade
Compress moddan çıkartıp tekrar deneyelim ;
SQL> alter table kamil.test nocompress
Shrink işlemi ile ile unutulmaması gereken bir noktada, shrink işlemi yapılırken tablo locklı olarak üzerinde işlem yapılacağından dolayı işlem bitene kadar tabloya erişimin olmaması gerekmektedir.
Tablo üzerinde istemiş olduğumuz küçülmeyi sağlamış bulunuyoruz. Bir sonraki yazımda lob segmentler üzerinde nasıl shrink yapabiliriz den bahseteceğim.
This entry was tagged disable enable row movement, how does shrink, ora-, oracle, shrink, table fragmantasyon. Bookmark the permalink.
← Troug day- 9 Şubat’ta Tom Kyte aramızda
Lob Segmentler Nasıl Shrink Edilir ? →
yakup masca 18 Ocak 2012 at 06:57
Emeğinize sağlık hocam.Kolaylıklar…
yakup masca için bir cevap yazın Cevabı iptal et