Utrzymuję bazę danych SQL Server 2005, która zawiera około 2,9 TB danych (2 x 1,45 TB - mam schemat RAW i schemat ANALIZY, więc w zasadzie dwie kopie zebranych danych). Model odzyskiwania jest PROSTY i .ldf
ma prędkość 6 Gb.
Z jakiegokolwiek powodu .mdf
jest to 7,5 TB. Teraz w tabeli ANALIZA są tylko 2-3 dodatkowe kolumny i niewiele NVARCHAR(MAX)
kolumn, które z tego, co (mogłem błędnie zrozumieć - popraw mnie, jeśli się mylę) może powodować dodatkowe przydzielanie miejsca. Dzieje się tak po zmniejszeniu bazy danych - wcześniej było to około 9 TB. jakieś pomysły?
I proszę, daj mi znać, jeśli masz dodatkowe pytania - jestem zupełnie nowy w administrowaniu bazami danych i optymalizacji (zazwyczaj nie wykonuję tej strony pracy :)).
Wielkie dzięki!
Andrija
źródło
Odpowiedzi:
Czy w swoich szacunkach wielkości uwzględniłeś ilość miejsca zajmowanego przez indeksy? Również jeśli masz pola tekstowe, które są ustawione jako wielobajtowe (
N[VAR]CHAR
zamiast[VAR]CHAR
), a pliki wejściowe to UTF-8 lub zwykły jeden bajt na znak, zwiększy to twoje wymagania dotyczące pamięci nawet dwa razy. Ponadto pamiętaj, że jeśli masz klastrowany klucz / indeks w tabeli, rozmiar tego wpływa na wszystkie inne indeksy w tabeli, ponieważ zawierają one wartość klucza klastrowego dla każdego wiersza (tak by dać skrajny przykład, jeśli tabela ma NCHAR (10). ) w przypadku, gdy zrobiłaby to INT i to jest twój klastrowany klucz / indeks, nie tylko używasz dodatkowych 16 bajtów na wiersz na stronach danych, ale również marnujesz 16 bajtów na wiersz w każdym innym indeksie w tej tabeli ) .Ponadto część miejsca zostanie przydzielona, ale nieużywana, albo dlatego, że silnik DB zostawił trochę miejsca przydzielonego po usunięciu, aby można go było szybko wykorzystać do nowych danych w tej tabeli lub ponieważ wzorzec wstawiania i usuwania pozostawił wiele stron tylko część pełny.
Możesz uruchomić:
aby szybko sprawdzić, które stoliki zajmują miejsce.
Również
EXEC sp_spaceused
uruchomienie w ramach tej DB zwróci dwa zestawy wyników. Pierwsza pokazuje całkowitą przestrzeń przydzieloną w systemie plików dla plików danych i ile z nich jest nieprzydzielone, druga pokazuje, ile przydzielonej przestrzeni jest wykorzystywane na strony danych, strony indeksu lub jest aktualnie nieużywane.sp_spaceused
zwróci również przestrzeń używaną przez dany obiekt, więc możesz zapętlić to, aby zbudować tabelę do analizy:Powyższy kod wyświetli wszystkie rozmiary tabel na jednej liście plus jeden wiersz dla sum. W razie potrzeby możesz użyć różnych widoków systemu (takich jak
sys.objects
isys.dm_db_partition_stats
używanych w pierwszym zapytaniu powyżej, zobacz http://technet.microsoft.com/en-us/library/ms177862.aspx, aby uzyskać więcej szczegółów), aby uzyskać więcej szczegółów, takich jak miejsce używane przez każdy indeks.W pliku danych znajdują się trzy klasy nieużywanego miejsca:
sp_spaceused
bez określonego obiektu)sp_spaceused
danych wyjściowych.Kolejnym zastrzeżeniem są tutaj duże obiekty (
TEXT
kolumny,[N]VARCHAR(MAX)
wartości powyżej określonego rozmiaru i tak dalej), ponieważ są umieszczane poza stroną, po prostu biorąc 8 bajtów w głównym wierszu danych, aby trzymać wskaźnik do danych w innym miejscu), więc może przekroczyć limit 8192 bajtów na wiersz.tl; dr: Szacowanie oczekiwanych rozmiarów baz danych może być o wiele bardziej zaangażowane, niż początkowo zakładać.
źródło
Spróbuj uruchomić
sp_spaceused
bazę danych. Jako przykład zwraca:Aby uruchomić go w bazie danych, wystarczy
USE
uruchomić bazę danychsp_spaceused
.Jeśli nadal pokazuje dużo niewykorzystanego miejsca, możesz ponownie spróbować zmniejszyć. Czasami zdarza mi się, że potrzeba wielu prób. Czasami też uważam, że najlepiej jest zmniejszyć pojedynczy plik, a nie bazę danych jako całość. Jednak może się okazać, że masz 2,9 TB danych i kolejne 4 + Tb indeksów, w którym to przypadku 7,5 TB jest całkiem rozsądne. Jeśli chcesz
sp_spaceused
sprawdzić ilość miejsca (danych i indeksu) w każdej tabeli, możesz uruchomić również na poziomie tabeli. Możesz uruchomić go we wszystkich tabelach w bazie danych, używając następującego polecenia:Mimo, że uczciwe ostrzeżenie sp_msforeachtable jest nieudokumentowane, nie jest obsługiwane i wiadomo, że omija tabele. Z drugiej strony sam miałem z tym sporo szczęścia.
Biorąc to wszystko pod uwagę, baza danych POWINNA mieć pewien procent wolnego miejsca w zależności od oczekiwanego wzrostu. Zasadniczo chcesz mieć pewność, że masz miejsce na wzrost od 6 miesięcy do kilku lat. Będziesz także chciał sprawdzić swoje
autogrowth
ustawienia, aby upewnić się, że są odpowiednie do twojej sytuacji. W szczególności biorąc pod uwagę rozmiar bazy danych NIE chcesz używać%autogrowth
.źródło
Za pomocą SQL Management Studio: 1. Kliknij prawym przyciskiem myszy bazę danych, a następnie 2. Kliknij Zadania-> Zmniejsz -> Pliki
Zobaczysz okno dialogowe pokazujące: Obecnie przydzielone miejsce b. Dostępne wolne miejsce + (% za darmo)
Jeśli Twój% Free wynosi ponad 50%, możesz rozważyć zmniejszenie pliku. Widziałem ten hit aż 90%. Jeśli zdecyduję się zmniejszyć plik, zwykle ustawiam go na 2 lub 3 koncerty więcej niż aktualnie przydzielone miejsce. Większość moich baz danych ma mniej niż 50 sztuk. Więc jeśli masz znacznie większy plik, możesz zwiększyć go do 10 koncertów. Zwykle martwię się tylko o zmniejszenie, jeśli zamierzam przenieść bazę danych na inny serwer, możesz przeczytać wszystko o zmniejszaniu się problemów na dowolnej stronie sql.
źródło