Wenn Sie in SqlServer 2005 eine Nachschlagetabelle (enum) entwerfen, sollten Sie, wenn Sie wissen, dass die Anzahl der Einträge niemals sehr hoch wird, anstelle von int auch tinyint verwenden? Ich bin sehr besorgt über die Leistung, insbesondere die Effizienz der Indizes.Lohnt es sich, Tinyint anstelle von Int für SqlServer-Lookup-Tabellen zu verwenden?
Angenommen, Sie haben diese Vertreter Tabellen:
Person
------
PersonId int (PK)
PersonTypeId tinyint (FK to PersonTypes)
und
PersonTypes
-----------
PersonTypeId tinyint
PersonTypeName varchar(50)
Die offensichtlichen Faktoren sind Datengröße und Codierung Ärger. Wenn wir zu 100 Millionen Zeilen in der Personen-Tabelle kommen, speichern wir 300 Millionen weniger Bytes mit Tinyint im Gegensatz zu Int, plus den von unseren Indizes eingenommenen Platz. Keine große Menge an Daten, aber signifikant, wenn die Designentscheidung auf Dutzende großer Tabellen angewendet wird. Der Coding-Aufwand kommt natürlich von all diesen Casting-Problemen zurück im ASP.NET C#/VB-Code.
Wenn wir diese beiden Probleme beiseite legen, was kommt sonst noch ins Spiel? Werden Abfragen aufgrund der geringeren Größe der Indexseiten wesentlich effizienter? Oder gibt es eine Art Polsterung, die die Vorteile zunichte macht? Irgendwelche anderen gotchas?
Ich habe immer nur ints persönlich verwendet, aber ich denke an Tinyint für ein bevorstehendes Redesign/Migration auf einigen riesigen Tischen, also würde ich gerne einen Rat bekommen.
[Bearbeiten]
Nachdem mit diesem experimentieren rechnete der Codierung Ärger I erwies sich als ein Nicht-Thema. Der Wechsel von int zu tinyint hat zu keinerlei Problemen mit dem Casting geführt.
Sowie ich abschätzen kann, wäre der Effekt 88 -> 70 für eine der wichtigsten Tabellen, die ich im Sinn habe. –
wahrscheinlich nicht viel Bedeutung dann ... weiß nicht, welche db ur verwenden, aber auf SQL Server, IO-Seiten sind 8K, so für Tabellen Scans/sucht Sie von 93 bis 117 Datensätze pro Seite gehen würde. Was ist mit den Indizes? Sind diese int-Spalten in Ihren Indizes? Es könnte dort einen Biiger-Effekt haben. –
Ja, die Tabelle hat mehr als ein Dutzend Indizes und wird stark für OLTP verwendet. Die Indexgröße auf der Festplatte beträgt 10x Datengröße. Diese Spalten stammen tatsächlich aus einer separaten Tabelle, die denormalisiert wird, um die Anzahl der benötigten Joins zu reduzieren. Indizes werden fast alle so modifiziert, dass sie diese neuen Felder enthalten. –