Mam tabelę z 490 wierszami M i 55 GB miejsca na stole, czyli około 167 bajtów na wiersz. Tabela ma trzy kolumny: a VARCHAR(100)
, a DATETIME2(0)
i a SMALLINT
. Średnia długość tekstu w VARCHAR
polu wynosi około 21,5, więc nieprzetworzone dane powinny mieć około 32 bajtów na wiersz: 22 + 2 dla VARCHAR
, 6 dla DATETIME2
i 2 dla 16-bitowej liczby całkowitej.
Pamiętaj, że powyższe miejsce to tylko dane, a nie indeksy. Używam wartości zgłoszonej w obszarze Właściwości | Przechowywanie | Ogólne | Przestrzeń danych.
Oczywiście musi być trochę narzutu, ale 135 bajtów na wiersz wydaje się dużo, szczególnie w przypadku dużego stołu. Dlaczego to może być? Czy ktoś jeszcze widział podobne mnożniki? Jakie czynniki mogą wpłynąć na ilość wymaganej dodatkowej przestrzeni?
Dla porównania próbowałem stworzyć tabelę z dwoma INT
polami i 1 M rzędami. Wymagane miejsce na dane wyniosło 16,4 MB: 17 bajtów na wiersz, w porównaniu do 8 bajtów surowych danych. Innym tabeli test o INT
i VARCHAR(100)
wypełniona samego tekstu jako rzeczywistym stole wykorzystuje 39 bajtów w rzędzie (44) K wierszy, w których byłoby oczekiwać 28 Plus trochę.
Tak więc stół produkcyjny ma znacznie więcej kosztów ogólnych. Czy to dlatego, że jest większy? Spodziewałbym się, że rozmiary indeksu będą w przybliżeniu N * log (N), ale nie rozumiem, dlaczego przestrzeń wymagana dla danych rzeczywistych jest nieliniowa.
Z góry dziękuję za wszelkie wskazówki!
EDYTOWAĆ:
Wszystkie wymienione pola są NOT NULL
. Tabela rzeczywista ma klastrowane PK na VARCHAR
polu i DATETIME2
polu, w tej kolejności. Dla dwóch testów pierwszym INT
był (klastrowany) PK.
Jeśli ma to znaczenie: tabela jest zapisem wyników ping. Te pola to URL, data / godzina pingowania i opóźnienie w milisekundach. Dane są stale dodawane i nigdy nie aktualizowane, ale dane są okresowo usuwane, aby ograniczyć je do zaledwie kilku rekordów na godzinę na adres URL.
EDYTOWAĆ:
Bardzo interesująca odpowiedź tutaj sugeruje, że dla indeksu z dużą ilością czytania i pisania przebudowa może nie być korzystna. W moim przypadku zajmowane miejsce jest problemem, ale jeśli ważniejsza jest wydajność zapisu, lepiej byłoby mieć luźne indeksy.
źródło
VARCHAR
sw powyższym oszacowaniu, ale nie liczbę kolumn. Ta tabela nie ma pól NULLable (należy o tym wspomnieć), czy nadal alokuje dla nich bajty?Czy typy danych zmieniły się z czasem? Czy kolumny o zmiennej długości zostały usunięte? Czy indeksy były często defragmentowane, ale nigdy nie odbudowywane? Czy usunięto wiele wierszy lub znaczną zaktualizowano wiele kolumn o zmiennej długości? Dobra dyskusja tutaj .
źródło
VARCHAR
iDATETIME2
pól, w tej kolejności. Wkładki będą równomiernie rozmieszczone dla pierwszego pola. W drugim polu nowe wartości i zawsze będą większe niż jakiekolwiek istniejące.