SQL Server 2008 – Unsigned-Integer-Datentypen
Ich bin mit SQL SERVER 2008 habe ich eine Reihe von INT, SMALLINT-Felder in meinen verschiedenen Tabellen, Und ich weiß, Sie alle werden 0 oder größer als 0 ist, d.h. ich kann Sie ohne Vorzeichen.
Gibt es eine einfache Möglichkeit der Erstellung/Verwendung von Unsigned Datentypen ODER muss ich die Create type->Regel->Verwenden, die Erstellt Art; wie angegeben in der folgenden Artikel?
http://www.julian-kuiters.id.au/article.php/sqlserver2005-unsigned-integer
Wenn das der einzige Weg, um die Verwendung nicht signierter in SQL gibt es keine Nachteile/Nachteil bei der Verwendung es?
- Wenn der Grund ist, dass Sie nur wollen, um sicherzustellen, dass der Wert größer als null, dann können Sie eine einfache
CHECK
- Einschränkung für die Spalte. - Durch die Einnahme Nicht, wir können die Speicher - /storage-in einer besseren Art und Weise. Und der Grund ist NICHT, dass der Wert größer ist als 0 ODER nicht. Es ist rein aus Gründen der Einsparung von Speicher.
- Sieht aus wie Sie versuchen, etwas zu optimieren, sollten Sie nicht. Lassen Sie die DBMS verwalten Sie Ihren Speicher, es ist ganz gut.
- Ich werde lakhs von Zeilen in meiner Tabelle, und es ist eine Spalte, deren Werte im Bereich von 50000-60000, wird es nicht eine gute Idee, um als unsigned smallint. Auch habe ich noch einen Fall, wo ein Unsigned Int verwendet werden könnte, statt Bigint.
- Verwenden Sie einfach einen
integer
und fügen Sie entweder eineCHECK
constraint oder Trigger, um die Werte zu überprüfen. - Der Artikel, den Sie verlinken, verwendet
rules
die sind veraltet. Sie können auch erstellen, CLR UDT jetzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den wichtigsten (und eher kritisch) Nachteil ist, dass es scheint, dass der link die Sie eigentlich nicht was Sie denken, es tut.
Es lediglich nur macht eine neue integer-Typ, der nur positiv sein kann, ist es nicht versorgen Sie mit alle Platz sparen, die sonst durch die Nutzung einer unsigned-Feld (die scheint Ihr Hauptziel). das ist zu sagen, dass der max Wert Ihrer
unsignedSmallint
wäre das gleiche wie der max-Wert fürsmallint
, also würden Sie noch verschwenden diese zusätzlichen Bits werden (aber mehr also da kann man nicht einfügen, negative Werte).Ist zu sagen, dass Ihre
unsignedInt
würde nicht zulassen, dass Werte oberhalb von 2^31-1.Ich verstehen und schätzen, dass in 100 Millionen Zeilen, die Einsparungen durch einen int32 vs int64 auf eine einzelne Spalte ist etwa 380 MB. Vielleicht der beste Weg für Sie, dies zu tun ist, dies zu behandeln ist, um Ihre gespeicherten offset-Wert, nachdem Sie es gelesen, im Idealfall innerhalb einer Sicht und immer nur Lesen, dass anzeigen, und dann, wenn eine insert-hinzufügen von -2^31 bis der Wert.. Aber das problem ist dann, das die Analyse für int32 tritt vor dem einfügen, so dass
INSTEAD OF
Trigger funktioniert nicht.. (ich weiß nicht von irgendeiner Weise zu machen, die einen INSTEAD OF-trigger, akzeptiert verschiedene Arten von besitzenden Tabelle)Stattdessen Ihre einzige option in diesem Zusammenhang ist es, gespeicherte Prozeduren verwenden, um
set
den Wert können Sie dann verwenden Sie entweder eine Ansicht oder eine gespeicherte Prozedur, um den Wert zurück:Dies kann getestet werden mit:
Werden Sie sehen, die Werte werden zurückgegeben unsigned, aber die zurückgegebenen Werte sind int64 und nicht unsigned32, damit Ihre Anwendung benötigen, so zu behandeln, als wären Sie noch int64.
Wenn Sie einen Fall haben, wo Sie sehen, signifikante Verbesserung aus, dies zu tun (wie fast jede Spalte in der Tabelle ist doppelt so groß, wie es anders werden muss), dann wird die Anstrengung oben könnte gerechtfertigt sein, ansonsten würde ich einfach bleiben mit
bigint
statt.Konvertieren signierten smallint, um eine Zahl ohne Vorzeichen versuchen Sie dies:
Konvertieren signed int in eine Zahl ohne Vorzeichen versuchen
zum Beispiel, wenn Ihre Tabelle ein Feld x ist vom Datentyp smallint und Sie zurückgeben möchten
unsigned
Wert dann versuchenDie geeignete Lösung hängt von dem problem, das Sie lösen möchten. Wenn dies ist ein identity-Feld, und Ihr Ziel ist es, die doppelte Anzahl von Zeilen, die Ihre Tabelle halten kann, ohne die 4 zusätzlichen bytes mit jeder Zeile zu verwenden, eine bigint, dann nur Saatgut das Feld auf zwischen-2.147.483.648 anstatt 1. Wenn Sie brauchen, um zu speichern Werte, die größer als 2.147 Milliarden, dann gehen Sie mit einem größeren Datentyp.