Wie viel Größe "Null" in SQL Server benötigt

118

Ich habe eine große Tabelle mit etwa 10 Spalten. 4 von ihnen bleiben meistens null. Ich habe eine Abfrage, die einen Nullwert hat, der eine beliebige Größe oder keine Größe in Bytes annimmt. Ich habe einige Artikel gelesen, von denen einige sagen:

http://www.sql-server-citation.com/2009/12/common-mistakes-in-sql-server-part-4.html

Es gibt ein Missverständnis, dass wenn wir die NULL-Werte in einer Tabelle haben, sie keinen Speicherplatz belegen. Tatsache ist, dass ein NULL-Wert Platz belegt - 2 Bytes

SQL: Verwenden von NULL-Werten im Vergleich zu Standardwerten

Ein NULLWert in Datenbanken ist ein Systemwert, der ein Byte Speicherplatz beansprucht und angibt, dass ein Wert nicht vorhanden ist, im Gegensatz zu einem Leerzeichen oder Null oder einem anderen Standardwert.

Können Sie mich bitte bezüglich der Größe des Nullwerts führen?

Rocky Singh
quelle

Antworten:

145

Wenn das Feld eine feste Breite hat, nimmt das Speichern von NULL den gleichen Platz ein wie jeder andere Wert - die Breite des Feldes.

Wenn das Feld eine variable Breite hat, nimmt der NULL-Wert keinen Platz ein.

Zusätzlich zu dem Speicherplatz, der zum Speichern eines Nullwerts erforderlich ist, entsteht ein Overhead für eine nullfähige Spalte. Für jede Zeile wird ein Bit pro nullbarer Spalte verwendet, um zu markieren, ob der Wert für diese Spalte null ist oder nicht. Dies gilt unabhängig davon, ob die Spalte eine feste oder eine variable Länge hat.


Der Grund für die Abweichungen, die Sie bei Informationen aus anderen Quellen festgestellt haben:

  • Der Anfang des ersten Artikels ist etwas irreführend. Der Artikel spricht nicht über die Kosten einen Nullwert zu speichern, aber die Kosten , die mit der Fähigkeit , eine NULL zu speichern ( das heißt , die Kosten einer Spalte NULL festlegbaren machen). Es ist wahr, dass es etwas Speicherplatz kostet, eine Spalte auf Null zu setzen, aber wenn Sie dies getan haben, benötigt das Speichern von NULL weniger Speicherplatz als das Speichern eines Werts (für Spalten mit variabler Breite).

  • Der zweite Link scheint eine Frage zu Microsoft Access zu sein. Ich weiß nicht genau, wie Access NULL-Werte speichert, aber ich wäre nicht überrascht, wenn es sich von SQL Server unterscheidet.

Mark Byers
quelle
1
@Mark "Es ist wahr, dass es etwas Speicherplatz kostet, eine Spalte auf Null zu setzen, aber wenn Sie dies getan haben, benötigt es weniger Speicherplatz zum Speichern eines NULL als zum Speichern eines Werts (für Spalten mit variabler Breite)." Damit meinen Sie Zu sagen, es dauert 1 Bit als Größe im Speicher für variable Datentypen.
Rocky Singh
13
Die kleinste adressierbare Speichereinheit in den meisten Computersystemen ist eine byte(typischerweise 8 Bit). In Wirklichkeit bitnimmt a ein byte. Tolle Antwort Mark: +1.
JohnB
20
Ein zweites Bit und ein drittes Bit und bis zu einem achten Bit passen jedoch in dasselbe Byte.
Matti Virkkunen
1
@ Mark - Ja, das sieht viel klarer aus. Entschuldigung für den verschwundenen Kommentar. Ich wollte es überarbeiten, aber meine Internetverbindung wurde zwischen Löschen und Senden unterbrochen! Es hängt auch ein wenig davon ab (aus dem Kommentarbereich hier). "Für Heap- und Clustered-Index-Datensätze gibt es immer eine NULL-Bitmap. Für nicht-Clustered-Indizes gibt es keine, wenn alle Spalten im Index NICHT NULL sind."
Martin Smith
2
@ Martin Smith: Das wusste ich nicht. Das macht die Sache komplizierter, denn wenn ich es richtig verstehe, bedeutet dies, dass das Nullstellen einer Spalte den erforderlichen Speicherplatz nicht erhöht (da die Null-Bitmap immer vorhanden ist), es sei denn , diese Spalte befindet sich ebenfalls in einem Index und die anderen Spalten im Index sind nicht nullbar. In diesem Fall muss der Index jetzt eine Null-Bitmap enthalten.
Mark Byers
30

Die folgende Verbindung , behauptet , dass , wenn die Spalte mit variabler Länge ist, das heißt varchardann NULLnimmt 0 Byte (plus 1 Byte wird auf Flag verwendet , ob der Wert ist NULLoder nicht):

Der obige Link sowie der folgende Link behaupten, dass für Spalten mit fester Länge, dh char(10)oder int, ein Wert von NULLdie Länge der Spalte belegt (plus 1 Byte, um zu kennzeichnen, ob dies der Fall ist NULLoder nicht):

Beispiele:

  1. Wenn Sie ein char(10)auf setzen NULL, belegt es 10 Bytes (auf Null gesetzt)
  2. An intbenötigt 4 Bytes (ebenfalls auf Null gesetzt).
  3. Eine varchar(1 million)Einstellung auf NULL0 Bytes (+ 2 Bytes)

Hinweis: Bei einer leichten Tangente entspricht die Speichergröße von varcharder Länge der eingegebenen Daten + 2 Byte.

JohnB
quelle
Würde ein Varchar, der einen NULL-Wert speichert, nicht 0 + 2 + 1 Bytes (NULL-Overhead) benötigen?
Akash
Es sollte + 1 Bit sein, um NULL zu kennzeichnen. @Akash: 2 Bytes sollten nicht erforderlich sein, da die Bitmap den Wert bereits als NULL kennzeichnet (es werden keine Informationen hinzugefügt).
Simo Kivistö
5

Von diesem Link :

Jede Zeile verfügt über eine Null-Bitmap für Spalten, die Nullen zulassen. Wenn die Zeile in dieser Spalte null ist, ist ein Bit in der Bitmap 1, andernfalls ist es 0.

Für Datentypen mit variabler Größe beträgt die tatsächliche Größe 0 Byte.

Für Datentypen mit fester Größe ist die tatsächliche Größe die Standarddatentypgröße in Byte, die auf den Standardwert festgelegt ist (0 für Zahlen, '' für Zeichen).

Kevin LaBranche
quelle
Sie wollen sagen, dass für Datentypen wie nvarchar (max) varchar (max) Null 0 Bytes benötigt und für int, chars usw. die Standardgröße auf die Standardwerte angewendet wird, die sie haben?
Rocky Singh
4

Das Speichern eines NULL-Werts benötigt keinen Platz.

"Tatsache ist, dass ein NULL-Wert Platz belegt - 2 Bytes."

Dies ist ein Missverständnis - das sind 2 Bytes pro Zeile , und ich bin mir ziemlich sicher, dass alle Zeilen diese 2 Bytes verwenden, unabhängig davon, ob es nullbare Spalten gibt.

Ein NULL-Wert in Datenbanken ist ein Systemwert, der ein Byte Speicherplatz beansprucht

Hierbei handelt es sich um Datenbanken im Allgemeinen, nicht speziell um SQL Server. SQL Server verwendet kein 1-Byte zum Speichern von NULL-Werten.

Gabe
quelle