Veritabanını küçültmek ne zaman uygundur?


43

Küçültmenin şeytan olduğunu biliyorum: Sayfa sırasını tersine çevirir ve cilt kanseri, veri parçalanması ve küresel ısınmadan sorumludur. Liste devam ediyor ... Diyelim ki 100 GB veri tabanım var ve 50 GB veriyi siliyorum - bir tabloda değil, veri tabanının% 90'ını kapsayan geniş bir veri tabanındaki eski verilerin genel bir budaması. tablolar - bu veritabanını küçültmek için uygun bir kullanım durumu teşkil ediyor mu?

Olmazsa, böyle yüksek bir veri yüzdesini veritabanından çıkardıktan sonra evi temizlemek için atılması gereken adımlar nelerdir? İki tane düşünebilirim: Dizinleri Yeniden Oluştur ve İstatistikleri Güncelle. Başka?

Yanıtlar:


13

Bir yeniden düzenleme ve küçültme asla gerçekten tavsiye edilmez.

Veritabanının çevrimdışı olarak kullandığı uygulamaları alabilirseniz, işlemi küçültmeden önce tüm dizinleri ve birincil / yabancı anahtar kısıtlamalarını kaldırarak süreci hızlandırabilir ve dizin parçalanmasını azaltabilirsiniz (bu, yalnızca veri sayfaları, şu anda olmayan dizin sayfalarında değil, süreci hızlandırarak karıştırılır, sonra tüm dizinleri ve anahtarları yeniden oluşturur.

Dizinlerin büzülme işleminden sonra yeniden oluşturulması, bunların önemli ölçüde parçalanmaması gerektiği ve büzülme sırasında bunların giderilmesi, yeniden oluşturulması anlamına geldiğinde, sayfa tahsisinde, daha sonra parçalanmaya davet edebilecek dosyalar içinde çok sayıda küçük "delik" bırakmayacaktır.

Uygulamaları çevrimdışı olarak kullanabilmeniz için başka bir seçenek de, tüm verileri aynı yapıdaki yeni bir veritabanına geçirmek. Derleme işleminiz sağlamsa, o zamanki boş DB'yi hızlı bir şekilde oluşturabilmelisiniz, mevcut DB'den bir tane oluşturmazsanız (mevcut olanın bir yedeğini geri yükleyin, tablolardaki tüm içerikleri kesin / silin) ​​ve tam bir küçültme yapın).

Hedefe tüm endeksleri bırakıp daha sonra yeniden oluşturmak isteyebilirsiniz, çünkü bu, endekslenmiş verilerin çoğunu değiştirirken daha verimli olabilir (bu durumda% 100). Kopyalama işlemini hızlandırmak için, hedef veri tabanının veri dosyalarının farklı fiziksel sürücülerdeki kaynak dosyalarına (SSD kullanmıyorsanız, bu durumda kafa hareketlerini azaltmakla ilgilenmenize gerek kalmaz), bunları taşıyın. İşiniz bittiğinde kaynak yere.

Ayrıca, hedefi yeni olarak oluşturmak (kaynağın bir kopyasını boşaltmak yerine), tüm geçerli verileri artı birkaç aylık büyümeye değecek bir başlangıç ​​boyutuyla oluşturun - bu da veri kopyasını biraz daha hızlı hale getirecek süreç boyunca şimdi ve tekrar yeni bir alan tahsis etmeyecektir.

Bu, küçültmeyi kullanmaktan daha iyi olabilir çünkü verileri yeni bir veritabanına geçirmek, küçültme işleminin amaçlanan eylemini çoğaltır, ancak potansiyel olarak çok daha az parçalanmayla (bu yeniden düzenleme ve küçültmenin istenmeyen sonucu olur). Bir daralma, dosyanın sonuna yakın bir şekilde blokları alır ve ilgili verileri bir arada tutmak için hiçbir çaba sarf etmeden başlangıçta daha yakın olan ilk alana yerleştirir.

Sonrasında daha az bölüm kullanılmış sayfalar olması muhtemel olduğundan, sonucun alan açısından daha verimli olacağından şüpheleniyorum. Bir daralma, yalnızca kısmen kullanılmış sayfaları dolaştıracak, verilerin taşınması, özellikle bir tablonun kümelenmiş anahtarı / dizini (bir tablonun bulunduğu yerde) hedefine eklerseniz ve başka dizinler oluşturuyorsanız, tam sayfalara neden olma olasılığı daha yüksektir. Verilerin tümü taşındıktan sonra.

Elbette uygulamaları çevrimdışı duruma getiremiyorsanız, sadece bir psikiyatrist yapmak tek seçeneğinizdir, bu yüzden gerçekten alanın yeniden kazanılması gerekiyorsa bununla devam edin. Verilerinize, erişim düzenlerine, genel çalışma kümesi boyutuna, sunucunun RAM sayısına ve benzerlerine bağlı olarak, ekstra dahili parçalanma, sonuçta bu kadar önemli olmayabilir.

Kopyalama işlemi için, SSIS veya baz T-SQL de aynı şekilde çalışır (SSIS seçeneği daha az verimli olabilir ancak daha sonra bakımı potansiyel olarak daha kolay olabilir). Sonunda endekslerle birlikte FK ilişkileri oluşturursanız, her durumda basit bir "her tablo için kopyala" yapabilirsiniz. Elbette, bir kereye mahsus olmak üzere, küçültme + yeniden düzenleme muhtemelen de iyidir ama ben insanları düzenli olarak küçümsemeyi düşünmeden korkutmayı seviyorum! (İnsanları günlük olarak programladıklarını biliyorum).


16

Veritabanı tekrar büyüyecek mi? Öyleyse, küçültme işlemlerine harcayacağınız çaba yalnızca boşa harcanacak, çünkü dosya boyutunu küçültüp daha fazla veri eklediğinizde, dosyanın yeniden büyümesi gerekecek ve bu büyümenin gerçekleşmesi için işlemlerin beklemesi gerekiyor. En düşük otomatik büyüme ayarlarına ve / veya yavaş bir sürüme sahipseniz, bu büyüme etkinliği oldukça acı verici olacaktır.

Veritabanını küçültürseniz, boş disk alanını ne için kullanacaksınız? Yine, eğer bu veritabanı tekrar büyüyebilirse, o alanı boş bırakacaksanız, o zaman sadece tekerleklerinizi döndürüyorsunuz.

Yapmayı düşündüğünüz şey, şu anda dosyadaki tüm bu boş alana sahip olduğunuzdan, dizinlerinizi daha iyi optimize edilmeleri için yeniden oluşturmaktır (ve bunu yapmak için boş alana sahip olduğunuzda bunu yapmak daha az acı verici olacaktır - bir süveteri büyük bir yatak odasına karşı küçük bir dolapta değiştirmeye çalışmayı düşünün).

Yani bu büyük bir temizlik işlemi olmadıysa ve gerçekten aynı veri seviyesine gelmeyecekseniz, sadece olduğu gibi bırakın ve diğer optimizasyon alanlarına odaklandım.


@Aron Bertrand Büyük ve diskin sağlam bir hale getirmek istediğimden biraz büyük bir sorun çıkarması 10 yıl sürdü. 5GB'lık bir büyüme ile 60GB'a kadar küçülmeyi düşünüyordum. Gerçekten önerdiğin tek şey indeksleri yeniden oluşturmak olacak, değil mi? İnsanların biraz daha tavsiye edebileceğini düşündüm.
bumble_bee_tuna

Ve sadece ihtiyaçları olursa yeniden inşa etmeyi öneriyorum. Ama dosyayı küçültmeden önce bunu yapardım. Gerçekten de kafamın üstünden, genel durumda performans iyileştirmeleri sağlayacak bir boş alan ile yapacağınız hiçbir şey düşünemiyorum ...
Aaron Bertrand

2

Eğer alanınız tükeniyorsa ve verilerinizin o kadar büyük olması beklenmiyorsa, küçülün, ancak tipik büyümeye olanak sağlayan uygun doldurma faktörleriyle endekslerinizi yeniden oluşturun.

Son hedefiniz aslında yedekleme boyutunu azaltmaksa, işlem günlüğünü silmek için kapsamlı bir yedekleme stratejisi uyguladığınızdan emin olun ve db'yi yedeklediğinizde, sıkıştırma seçeneklerini kullanın.

Genellikle 5GB'lık büyüme beklemiyorsanız, 5GB'lık otomatik büyümeyi tavsiye etmem. Aksi takdirde aralıklı performans problemleriniz olabilir. Veri büyüklüğünüz ilk önce bir yıl için gerekli olduğunu düşündüğünüz bir değere ayarlanmalı ve Otomatik Büyüme, test ettiğiniz bir boyuta ayarlanmalı ve işletme performansını etkilememelidir. Bkz Do SQL Server o Küçült veritabanı Düğmesi Dokunma! Mike Walsh tarafından.

Daraltmadan önce dizinleri yeniden oluşturmak, dizinlerin kötü bir şekilde yerleştirilmesine neden olur. Küçültmek için yeniden inşa etmek iyi değil. Küçültme, endekslerin alanı kurtarmak için yönlendirilmesine neden olur - bu nedenle önceden yeniden oluşturma daraltmanın anlamı yoktur. Bkz . Thomas LaRock tarafından Otomatik Shrink Kullanımı Ne Zaman .


Küçültürseniz, dizinleri yeniden oluşturursanız, yeniden oluşturmak için kullanılan verilerin kopyasını alabilmek için veri dosyasının yeniden büyümesi gerekir. Bu durumda, orijinal veri dosyası kadar büyük olmayacak olsa da, yine de büyüme olacak ve karşı-üretken görünüyor. Boş alan varken yeniden oluşturma daha hızlı olacak (otomatik büyüme gerekmeyecek) ve genellikle dizinin yeni kopyası için sayfaları nasıl yerleştireceğiniz konusunda önerdiğinizden daha iyi olacak ve çoğu durumda bunun genel olarak daha kısa olacağından şüpheleniyorum. ve aynı veya daha iyi disk alanı kurtarma işlemine yol açar. Bazı testler için belki zaman.
Aaron Bertrand

Ve elbette bu, kalan veriler üzerindeki indekslerin aslında yeniden inşa edilmeleri gerekeceğini varsayıyor - belki de zaten oldukça iyi durumdalar.
Aaron Bertrand

1

Bunun küçültmeden sonra yeniden boyutlandırmaktan daha iyi çalışıp çalışmayacağını bilmiyorum ama başka bir seçenek de uygun boyutta yeni bir veri dosyası oluşturmak ve tüm verileri buna taşımak olacaktır. Bu durumda ilk önce bir reindex yapacağım böylece gerçek veri boyutunun ne olduğunu bilirsiniz. Birincisi, eğer bu birincil veri dosyasındaki ilk dosya ise, onu boşaltacağınızı sanmıyorum. Küçültmeniz, ardından verileri daha sonra geri taşımanız gerekir; bu, sayfanın ters çevrilmesini önler. Bununla birlikte, katı duruma geçmeyi düşünüyorsanız, bunun zaten büyük bir fark yaratmaması gerekir.


1

Bu yoldan geç geldik. Yine de, test ortamlarımızdaki büzülme kullanımını uzun süredir düşünmekteyiz. Konuya göre, orada olan psikiyatrist uygulanabilir bir seçenektir zamanlar. Ancak ne zaman ve nasıl uygulanacağını bilmek, hem uzun hem de kısa vadede uygun uygulama için hayati öneme sahiptir.

Senaryomuzda yakın zamanda büyük DB'mize sıkıştırma, bölümleme, arşivleme ve gereksiz eski verilerin silinmesi gibi sayısız değişiklik ekledik. Sonuç olarak, birincil veri dosyamızın kullanılan kısmı eskisinin yarısından daha azına düşmüştür. Peki tüm bu valizleri taşımanın amacı nedir? Özellikle web'deki bazı makalelerin aksine, veri dosyalarınızın boyutu DOĞRUDAN YEDEKLEME / GERİ ÖDEME İLE DOĞRUDAN İLİŞKİLİDİR. Bunun nedeni, çoğu makalenin aksine, gerçek hayat senaryolarının herhangi bir sayfada, belki de kaldırdığınız öğelere göre daha fazla veri yüklemesidir.

Daha da önemlisi, bu küçülmek için harika bir senaryo açıyor:

  1. Veritabanınızdaki tüm nesneleri ve dosya gruplarını bulabilecek bir komut dosyası oluşturun (çevrimiçi olarak bol miktarda örnek), bunu bırakma cümleleri oluşturmak ve bunun yanı sıra dizinlerinizin ve kısıtlarınızın her biri için tanım oluşturmak için bunu kullanın.
  2. Yeni bir dosya ve dosya grubu oluşturun ve bunu varsayılan yapın.
  3. Tüm kümelenmemiş dizinleri bırak (not, bazı dizinlerin kısıtlamaları olabilir).
  4. Kümelenmiş dizinlerinizi yeni dosya grubunda DROP_EXISTING = ON ile oluşturun (btw, birçok alternatife göre başlamak için çok hızlı, minimal olarak kaydedilmiş bir işlemdir).
  5. Topaklanmayan indekslerinizi yeniden oluşturun.
  6. Son olarak, eski veri dosyanızı SHRINK (genellikle PRIMARY).

Bu şekilde, orada bırakılan tek veri DB'nizin sistem nesneleri, istatistikleri, prosedürleri ve ne olursa olsun olacaktır. Büzülme çok daha fazla olmalı, ÇOK daha hızlı olmalı ve ana veri nesnelerinizde düzenli bir şekilde oluşturulacak ve gelecekteki parçalanma riskini asgari düzeyde tutacak daha fazla endeks bakımına gerek kalmayacaktır.

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.