|
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.
|