Dizinleri Yeniden Oluşturma, DB şimdi 10 kat daha büyük


13

Yaklaşık 15 konser bir SQL Server veritabanı (2008 R2 SP1) var. Bakımın bir süredir çalışmadığı ortaya çıktı, bu yüzden tüm dizinleri yeniden oluşturmak için bir bakım planı oluşturdum, çok parçalanmışlardı.

İş bitti ve parçalanma gitti, ama şimdi veritabanı 120 konserin üzerinde! Tüm yeniden yapılanmaları yapmak için ekstra alan kullanacağını anlıyorum, ancak şimdi iş bittiğinde, tüm bu alanın boş alan olacağını düşünürdüm, ancak boş alan sadece 3 konser olarak gösterilir, bu yüzden 117 konser kullanılıyor dizin yeniden oluşturma işi bitmiş olsa bile.

Ben çok karışık ve bazı rehberlik kullanabilirsiniz, makul bir boyuta geri db olsun, bunun için disk alanımız yok.

Şimdiden teşekkürler!

Her iki sorgunun sonuçları da şöyledir:

log_reuse_wait_desc HİÇBİR ŞEY

name    TotalSpaceInMB  UsedSpaceInMB   FreeSpaceInMB
LIVE_Data   152             123             28
LIVE_Log    18939           89              18849
LIVE_1_Data 114977          111289          3688

3. dosya bir .ndf dosyasıdır, kullanılmayan alanda sadece 3688'i gösteren dosyadır, ancak yaklaşık 15 gig veri için 111289 kullanılır.

Yanıtlar:


15

Bu arada bunu tam olarak anladım, toplam beyin geğirmek. Yeniden oluşturma işinde 90 doldurma faktörü olduğunu düşündüğümü belirtmiştim, ancak "boş alan yüzdesini değiştir" olarak ifade edildi, bu yüzden orada 90 değerini kullanarak, aslında 10 doldurma faktörü kullanıyordum! DOH. 10 kat büyüdüğüne şaşmamalı. Doğru dolgu faktörü ile yeniden inşa edeceğim, sonra küçüleceğim. Yine de giriş için herkese teşekkürler.


1
Bu sihirbaz çok korkunç.
usr

Biliyorum, komut satırında FILL_FACTOR belirttiğiniz ve ücretsiz% değil, tutarlı olmasını diliyorum.

Yeniden endeksleme sonra küçültme, sadece zaman kaybı! Daha fazla bilgi için cevabıma bakın.
JNK

1
JNK Ne demek istediğini biliyorum, yeniden inşa ettikten sonra küçülme çünkü bu her şeyi tekrar parçalayacak. Ancak, Jeff'in kazayla her sayfaya% 90 boş alan eklediği bu senaryoda, alanı geri almak için başka bir yol görmüyorum: fillfactor 90 ile yeniden oluşturmak, shrink dosyası, ancak başka bir yeniden oluşturma yapmak zorunda kalacaksınız. % 90 dolgu faktörü ile. Yoksa alanı geri almanın başka bir yolu var mı? (Belki yeni bir dosya grubu ve daha sonra yeni dosya
grubuna

2

Dizinlerin yeniden oluşturulması DB'de fazla boş alan oluşmasına neden olur. Bu, yeniden dizin oluşturma işleminin doğal bir yan ürünüdür - sunucu, geçerli sürümün yanında dizinin yeni, umarım bitişik bir sürümünü oluşturuyor, ardından tamamlandığında geçerli sürümü bırakıyor.

Yeniden endekslemeden sonra küçülmek anlamsızdır!

Sadece dizini yeniden parçalayacaksınız! Küçülme, DB içindeki verileri yeniden tahsis ederek boş alanı kaldırır.

İşte Microsoft'ta çalışırken, DBCCdaralmalar da dahil olmak üzere koddan sorumlu olan Paul Randal'dan neden küçülmemeniz gerektiğine dair güzel bir makale .


0

Yeniden oluşturma seçeneğini kullanmış olmalısınız SORT_IN_TEMPDB=ON.

Sizin durumunuzda, söz konusu tabloların bulunduğu gerçek veri dosyaları dizinleri sıralamak için kullanılmıştır. Bu 120GB alanın çoğu hala kullanılmıyor ve gerektiğinde sayfa verileriyle doldurulacak.

Bu sorgu ile kullanılan / boş alan durumunu görebilirsiniz ( buradan alınır ):

use [YourDatabaseNameHere]
go

select
    name,
    cast((size/128.0) as int) as TotalSpaceInMB,
    cast((cast(fileproperty(name, 'SpaceUsed') as int)/128.0) as int) as UsedSpaceInMB,
    cast((size/128.0 - cast(fileproperty(name, 'SpaceUsed') AS int)/128.0) as int) as FreeSpaceInMB
from
    sys.database_files

Belirli bir veritabanı dosyasını (veri veya günlük) küçültmek için, burada bazı bilgileri görebilirsiniz . Bundan önce bir uyarı, kullanılmayan alanı bırakmak 100+ Gb veritabanları için (depolama hızına da bağlıdır) oldukça uzun sürüyor, bu yüzden çalışmasına izin verin.


Evet biçimlendirmeyecek, bir soruya ekleyeceğim.

@JeffBane: Bu bilgiyi sorunuza bir fiyat teklifi ile ekleyebilir misiniz? Orada ne olduğunu anlayamıyorum.
Marcel N.

1
Bir dizini yeniden oluştururken, sıralama için dizinin iki katı +% 20 gerekir. Yani genel olarak db her dizini yeniden oluşturmak için sadece DB en büyük dizinin% 120 gerekir. SORT_IN_TEMPDB kullanırsanız, yalnızca% 20 kazanırsınız, yine de veri dosyanızda% 100 ek bir adisyona ihtiyacınız vardır. Dahası, tempdb'de sort kullanmak IO yükünüzü önemli ölçüde artırır, çünkü indeksi bir kez veri dosyasına yazmak yerine, şimdi tempdb'ye bir kez yazıp veri dosyasına yazarsınız. Yani bu her zaman ideal değildir.
Edward Dortland

-1

Başka bir ayrıntı olmadan, alanını geri kazanmadan önce bir işlem günlüğü yedeklemesi yapmanız gerektiğinden şüpheleniyorum.

Bak ne diyeceđim select name, log_reuse_wait_desc from sys.databases. Log_reuse_wait_desc sütunu diyorsa LOG_BACKUP, tran günlüğünün yedeğini alana kadar alan geri kazanamaz.


İşlem günlüğü yedeklemesi yapmak, sayfaların serbest bırakılmasına neden olmaz.
mrdenny
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.