Im Allgemeinen verwende ich immer Ints. Ich weiß, dass dies theoretisch nicht die beste Vorgehensweise ist, da Sie den kleinsten Datentyp verwenden sollten , der die Daten garantiert speichert.
Zum Beispiel ist es besser zu verwenden, tinyint
wenn Sie wissen, dass die einzigen Daten, die Sie speichern, eine 1, 0 oder Null sind (mit einer sehr geringen Chance, diese später auf 2 oder 3 zu erweitern).
Der einzige Grund, den ich dafür kenne, ist zu Speicherzwecken - Verwendung von 1 Byte in einer Zeile anstelle von 4 Byte.
Was sind die Auswirkungen der Verwendung tinyint
(oder smallint
sogar bigint
) von mehr als nur int
Platz auf Ihrer Festplatte zu sparen?
sql-server
database-theory
Richard
quelle
quelle
I'd use an ENUM for such a thing.
Nicht in SQL Server, Sie würden nicht, da es keine Aufzählungen jeglicher Art hat.Antworten:
Speicherplatz ist billig ... das ist nicht der Punkt!
Denken Sie nicht mehr an Speicherplatz, sondern an Pufferpool und Speicherbandbreite . Am äußersten Ende CPU-Cache und Speicherbusbandbreite . Der verknüpfte Artikel ist Teil der Reihe, in der Probleme mit der Auswahl von schlecht gruppierten Schlüsseln (INT vs GUID vs Sequential GUID) hervorgehoben werden, aber der Unterschied, den Bytes machen können, wird hervorgehoben.
Die übergeordnete Botschaft ist das Design. Der Unterschied wird nicht in einer einzelnen Datenbank auf einem entsprechend spezifizierten Server angezeigt, bis Sie das Gebiet der VLDB erreichen. Wenn Sie jedoch ein paar Bytes sparen können, warum nicht.
Ich werde an die Umgebung erinnert, die in einer früheren Frage beschrieben wurde . Über 400 Datenbanken mit einer Größe von 50 MB bis 50 GB pro SQL-Instanz. Das Scrubben einiger Bytes pro Datensatz, pro Tabelle und pro Datenbank in dieser Umgebung kann einen signifikanten Unterschied bewirken.
quelle
Neben den anderen Antworten ...
Zeilen und Indexeinträge werden auf 8.000 Seiten gespeichert. Eine Million Zeilen mit 3 Bytes pro Zeile entspricht also nicht 3 MB auf der Festplatte. Dies wirkt sich auf die Anzahl der Zeilen pro Seite aus ("Seitendichte").
Gleiches gilt für nvarchar bis varchar, smalldatetime bis datetime, int bis tinyint etc
Edit, Juni 2013
http://sqlblog.com/blogs/joe_chang/archive/2013/06/16/load-test-manifesto.aspx
Dieser Artikel besagt
Die Wahl des Datentyps spielt also eine Rolle
quelle
Es kommt nicht nur auf den Tischspeicher an. Wenn Sie Indizes verwenden, bei denen die Spalte int Teil eines zusammengesetzten Schlüssels ist, möchten Sie natürlich, dass die Indexseiten so voll wie möglich sind, da die Indexeinträge so klein wie möglich sind.
Ich würde definitiv erwarten, dass das Untersuchen von Indexeinträgen in BTREE-Seiten mit kleineren Datentypen etwas schneller ist. Alle VARCHARs, die an Indexeinträgen beteiligt sind, würden jedoch Leistungsgewinne aus der Verwendung von TINYINT über INT ausgleichen (aufheben).
Ungeachtet dessen, wenn Indexeinträge zusammengesetzte Einträge haben und alle Ganzzahlen sind, sind die Ganzzahlen umso besser und schneller, je kleiner sie byteweise sind.
quelle
Alle Dinge werden komplexer, wenn die Datenbanken größer werden:
Und welche Datentypen haben das zu tun? ALLES. Wenn Sie Zeilengrößen verwenden, die größer als erforderlich sind, werden Datenbankseiten früher als erforderlich gefüllt, und es wird sogar Speicherplatz verschwendet, wenn die Zeilengröße so gewählt ist, dass nicht mehr als ein Datensatz auf der Seite aufgezeichnet werden kann. Das Ergebnis ist, dass mehr Seiten zum Schreiben und Lesen benötigt werden, und dass mehr RAM-Speicher zum Zwischenspeichern verwendet wird (größere Datensätze erfordern mehr Speicher). Und da Ihre Datentypen größer als auf der Festplatte erforderlich angegeben sind, treten bei Ihren Indizes die gleichen Probleme auf - insbesondere, wenn Sie den zusammengesetzten Primärschlüssel mit 2 BIGINT-Spalten gruppieren, da alle anderen erstellten Indizes diesen Primärschlüssel implizit in ihre Definition kopieren.
Wenn Sie wissen, dass einige Spalten in einer Tabelle, die Millionen von Zeilen enthalten, oder sogar eine kleine Tabelle, die mehrere Millionen Zeilen enthält, keine 4-Byte-Ganzzahl zum Speichern ihrer Daten benötigen, sondern 2 Byte ausreichen - verwenden Sie SMALLINT . Wenn Werte im Bereich von 0 bis 255 ausreichen, geben Sie TINYINT ein . Eine Ja / Nein-Flagge? Es gibt BIT .
quelle
Während es bei
tinyint
vsint
deutliche Unterschiede gibt, wie z. B. Speicherplatz, Seitenteilung und Wartungszeit, würde es für keines von diesen Unterschiede gebenvarchar
.Warum also nicht alle Textfelder als deklarieren
varchar(4000)
, da es sowieso nur den benötigten Platz verbraucht? Darüber hinaus können Sie sicher sein, dass Ihre Daten niemals abgeschnitten werden.Die Antwort lautet natürlich:
Die gleichen Gründe gelten
tinyint
auch für.quelle