SQL Server 2005 - Hızlı El Kitabı
Skip Navigation Links.

SHRINK DATABASE

 

Veritabanımızda büyük silme işlemleri veya büyük veri yüklemeleri yaptığımızda veri tabanı boyutu gereğinden fazla kalabilir.Kullanılmayan data page’ler veri tabanı dosyamızda bulunabilir.Bu ve benzeri durumlarda yani kullanılmayan data page’lerin çok olması durumunda veri tabanı küçültmesi(shrinking) yapılabilmektedir.Her ne kadar veri tabanı küçültülebiliyorsa da,veri tabanı, minimum boyutundan daha küçük hale getirilemez.Hatta ve hatta veri tabanımızda hiç kayıt yoksa bile,başlangıçta 50 mb olarak belirlediğimiz veri tabanını 50 mb’dan daha küçük yapamazsınız.

 

Küçültme işlemini veri tabanının tamamı için yapmak isitiyor isek DBCC SHRINKDATABASE komutu, sadece bir dosyayı(veri veya log dosyası) küçültmek istiyor isek bu durumda DBCC SHRINKFILE komutu kullanılır.

 

Peki SQL Server bu işlemi(shrinking) nasıl yapmaktadır?

Örneğin bir dosyanın boyutunun 10 mb olduğunu düşünün.10 mb’lık dosyanın ise 6 mb’ında veri var.yani 4 mb’ı boş.Küçültme işlemi sırasında kullanıcı,son dosya boyutunun yüzde kaçının boş olması gerektiğini belirtir.Örneğin kullanıcı derse ki bu dosyanın %25’i boş olsun,daha fazlası boş olmasın,bu durumda dosya boyutu 8mb olmalıdır.Çünkü 2/8 = ¼ yani %25’dir.Dolayısıyla 10 mb’lık dosya boyutu 8 mb’a düşürülmektedir.dosyanın son 2mb’ı dosyanın başındaki boş yerlere yerleştirilirilir ve son 2 mb sisteme verilir.Böylece küçültme işlemi tamamlanmış olur.

 

Bir tablonun boyunun ne olduğu,ne kadar boş alana sahip olduğu verilerin ve indexlerin ne kadar yer kullandığı gibi bilgileri elde etmek için sp_spaceused stored procedure’ü kullanılır.Product tablosu hakkında bilgi almak için şu komutu kullanabiliriz;

 

EXEC sp_spaceused 'Production.Product'

 

 

Veri tabanını otomatik olarak küçültmek için şu komut kullanılır;

 

ALTER DATABASE AdventureWorks SET AUTO_SHRINK ON

 

 

Otomatik olarak değilde kendimiz veritabanını küçültmek istiyor isek DBCC SHRINKDATABASE komutunu kullanmalıyız.

 

ÖRNEK: AdventureWorks veri tabanında boş alan toplam alanın %20’u olacak şekilde küçültmek için şu komutu kullanırız;

 

DBCC SHRINKDATABASE (AdventureWorks, 20)

 

 

Şimdide AdventureWorks veri tabanı için kullanılan dosyanın boyutunu 20 mb olacak şekilde küçültelim;

 

DBCC SHRINKFILE (AdventureWorks_Data, 20)

 

 

 

ÖRNEK: Öncelikle AdventureWorks veri tabanı boyut(size) bilgilerini listeleyelim,ardından bir tablo oluşturup içini dolduralım ve bu şekilde boyutu tekrar gözlemleyelim.Ardından tabloyu drop edip son halini tekrar gözlemleyelim.

 

SELECT file_id, name, physical_name, size FROM sys.database_files;

 

CREATE TABLE tbl

(

      col1 CHAR(8000)

)

DECLARE @counter INTEGER

SET @counter = 2000

 

WHILE @counter > 0

BEGIN

      INSERT INTO tbl VALUES (' ')

      SET @counter = @counter - 1

END

 

SELECT file_id, name, physical_name, size FROM sys.database_files;

DROP TABLE tbl;

--DBCC SHRINKDATABASE (AdventureWorks, 0);

SELECT file_id, name, physical_name, size FROM sys.database_files;

 

 

 

 

SHRINK etmeden elde ettiğimiz sonuçlar bu şekildedir.Oluşturuduğumuz tbl isimli geçici tablo drop edildiği halde yer kaplamaktadır.Açıklama satırı haline getirdiğimiz SHRINKDATABASE komutunu işletirsek,elde edeceğimiz sonuç aşağıdaki gibi olacaktır.