Ogólnie zawsze używam Ints. Wiem, że teoretycznie nie jest to najlepsza praktyka, ponieważ należy używać najmniejszego typu danych, który gwarantuje przechowywanie danych.
Na przykład lepiej jest użyć, tinyint
gdy wiesz, że jedyne dane, które będziesz przechowywać, to 1, 0 lub zero (z bardzo małą szansą na rozszerzenie ich do 2 lub 3 później).
Jednak jedyny powód, dla którego to robię, to do celów przechowywania - użycie 1 bajtu w wierszu zamiast 4 bajtów.
Jakie są skutki używania tinyint
(lub smallint
nawet bigint
) po prostu int
innego niż oszczędzanie miejsca na dysku twardym?
sql-server
database-theory
Richard
źródło
źródło
I'd use an ENUM for such a thing.
Nie w SQL Server, nie zrobiłbyś tego, ponieważ nie ma żadnych wyliczeń.Odpowiedzi:
Miejsce na dysku jest tanie ... nie o to chodzi!
Przestań myśleć o przestrzeni dyskowej, zamiast tego pomyśl o puli buforów i przepustowości pamięci . Na samym końcu przepustowość pamięci podręcznej procesora i magistrali pamięci . Powiązany artykuł jest częścią serii podkreślającej problemy ze słabym wyborem klucza klastrowego (INT vs GUID vs Sekwencyjny GUID), ale podkreśla różnicę, jaką mogą wprowadzić bajty.
Nadrzędnym przesłaniem są kwestie projektowe. Różnica nie pojawi się w indywidualnej bazie danych na odpowiednio określonym serwerze, dopóki nie trafisz na terytorium VLDB, ale jeśli możesz zaoszczędzić kilka bajtów, dlaczego nie zrobić tego.
Przypomina mi się środowisko opisane we wcześniejszym pytaniu . Ponad 400 baz danych o wielkości od 50 MB do 50 GB na instancję SQL. Przeszukiwanie kilku bajtów na rekord, tabelę i bazę danych w tym środowisku może mieć znaczącą różnicę.
źródło
Oprócz innych odpowiedzi ...
Wiersze i wpisy indeksu są przechowywane na 8 000 stronach. Tak więc milion wierszy po 3 bajty na wiersz nie ma 3 MB na dysku: wpływa na liczbę wierszy na stronę („gęstość strony”).
To samo dotyczy nvarchar do varchar, smalldatetime do datetime, int do tinyint itp
Edycja, czerwiec 2013 r
http://sqlblog.com/blogs/joe_chang/archive/2013/06/16/load-test-manifesto.aspx
Ten artykuł stanowi
Wybór typu danych ma więc znaczenie
źródło
Uwzględnia się nie tylko przechowywanie stolików. Jeśli korzystasz z indeksów, w których kolumna int jest częścią klucza złożonego, naturalnie chciałbyś, aby strony indeksu były jak najbardziej pełne, ponieważ jest to wynik tak małych wpisów indeksu, jak to możliwe.
Na pewno spodziewałbym się, że sprawdzenie wpisów indeksu na stronach BTREE byłoby nieco szybsze przy mniejszych typach danych. Jednak wszelkie zmienne VARCHAR biorące udział we wpisach indeksu zrównoważyłyby (nullify) wzrost wydajności dzięki zastosowaniu TINYINT zamiast INT.
Niezależnie od tego, jeśli wpisy indeksu zawierają wpisy złożone i wszystkie są liczbami całkowitymi, im mniejsze są liczby całkowite, tym lepiej i szybciej.
źródło
Wszystkie rzeczy stają się bardziej złożone, gdy bazy danych stają się większe:
A jakie typy danych mają z tym wspólnego? WSZYSTKO. Używanie rozmiarów wierszy większych niż to konieczne powoduje, że strony bazy danych wypełniają się wcześniej niż jest to konieczne, a nawet marnuje miejsce, jeśli rozmiar wiersza jest taki, że na stronie nie można zapisać więcej niż jednego rekordu. Rezultatem jest więcej stron potrzebnych do zapisania i odczytu, więcej pamięci RAM jest wykorzystywane do buforowania tego (większe rekordy wymagają większej pamięci). A ponieważ typy danych są określone jako większe niż potrzebne z dysku, twoje indeksy będą miały ten sam problem - szczególnie jeśli klastrujesz ten klucz główny złożony z 2 kolumn BIGINT, ponieważ wszelkie inne utworzone indeksy skopiują ten klucz podstawowy domyślnie na ich definicji.
Jeśli wiesz, że niektóre kolumny w tabeli, która będzie miała miliony wierszy lub nawet małą tabelę, która będzie FK do wielomilionowego wiersza, który nie potrzebuje 4-bajtowej liczby całkowitej do przechowywania swoich danych, ale 2-bajtowy wystarczy - użyj SMALLINT . Jeśli wartości z zakresu 0–255 są wystarczające, TINYINT . Flaga Tak / Nie? Jest BIT .
źródło
Podczas gdy w przypadku
tinyint
vsint
istnieją wyraźne różnice, takie jak miejsce na dysku, podziały stron i czas konserwacji, nie byłoby żadnego z nichvarchar
.Dlaczego więc nie zadeklarować wszystkich pól tekstowych jako
varchar(4000)
, ponieważ i tak zużyje ono tylko potrzebną przestrzeń? Co więcej, masz gwarancję, że Twoje dane nigdy nie zostaną obcięte.Odpowiedź brzmi oczywiście:
Dotyczy to również tych samych powodów
tinyint
.źródło