Bis zur Version SQL Server 2005 mussten Spalten, die mit dem NULL belegt werden trotzdem Speicherplatz belegen. Das ist ok, wenn man bedenkt, dass eine Spalte auch eine leere Menge (keine Zeichen) beinhalten kann und somit sich von NULL unterscheidet. (‘’ ist nicht NULL)
Ab Version SQL 2008 kann nun diese scheinbare Platzverschwendung beeinflusst werden. Mit Hilfe der Angabe von Sparse wird der SQL Server angewiesen keinen Platz für den NULL Wert zu belegen. Das ist insbesondere für sehr breite Tabellenlayouts wichtig. So konnten bis dato nur 1024 Spalten in SQL verwendet werden. Nun kann man Spalten auch im 5 stelligen Bereich anlegen ;-). Der Vorteil sehr breiter Tabellen liegt darin, dass evtl keine zusätzlichen abhängigen Tabellen erstellt werden müssen, in den die jeweiligen Eigenschaften abgelegt werden.
Create table Produkte (PrID int indentity, Bezeichnung varchar(50) not null, Kalorien varchar(10) sparse, Kohlenhydrate varchar(10) sparse, eingeschweisst varchar(2) sparse, .... )
Einsparung durch SPARSE
Das ganze hat allerdings seinen Preis. Sobald Felder doch nicht mit NULL belegt werden, wird mehr Platz verbraucht. Der Prozentsatz aller Felder, die NULL haben müssen, damit das noch rentabel wird liegt je nach Datentyp bei mind. 42%!
Hier eine kleine Beispielliste, wie hoch der Prozentsatz der NULL Werte sein muss, damit ein SPARSE noch eine tatsächliche Einsparung bringt
bit 98%
uniqueidentifier 42%
date 49%
Vor und Nachteile von SPARSE
Sinnvoll ist der Einsatz dann, wenn mind 20 bis 40% Platz eingespart wird und rel. selten nach Werten ungleich NULL abgefragt wird.
Sparse Spalten haben auch noch einige kleine Nachteile: So können sie keinen Standardwert oder Regel haben. Sie kann auch nicht als Feld für einen zusammengesetzen Primärschlüssels sein oder auch eines gruppierten Index.
Auf der anderen Seite sind Sparse Columns besonders für gefilterte Indizes interessant, da sehr viele Werte ja NULL enthalten.