webentwicklung-frage-antwort-db.com.de

Warum und wann sollte ich SPARSE COLUMN verwenden? (SQL Server 2008)

Nachdem ich einige Tutorials zum neuen Feature SPARSE COLUMN von SQL SERVER 2008 durchgearbeitet habe, habe ich festgestellt, dass es keinen Speicherplatz beansprucht, wenn der Spaltenwert 0 oder null ist, aber wenn es einen Wert gibt, braucht es viermal so viel Platz wie ein regulärer Speicher (nicht spärlich) Spalte hält.

Wenn mein Verständnis richtig ist, warum werde ich das dann zum Zeitpunkt des Datenbankdesigns tun? Und wenn ich das benutze, dann in welcher Situation?

Auch aus Neugier, wie kommt es, dass kein Platz reserviert wird, wenn eine Spalte als spärliche Spalte definiert ist (ich meine damit, was ist die interne Implementierung dafür)?

Danke im Voraus

61
priyanka.sarkar

Eine spärliche Spalte verwendet 4x nicht die Menge an Speicherplatz, um einen Wert zu speichern, sondern einen (festen) 4 zusätzlichen Byte pro Nicht-Nullwert. (Wie Sie bereits gesagt haben, benötigt ein NULL 0 Leerzeichen.)

  • Ein Nicht-Null-Wert, der in einer bit -Spalte gespeichert ist, wäre also 1 Bit + 4 Bytes = 4,125 Bytes. Wenn jedoch 99% davon NULL sind, bedeutet dies immer noch eine Nettoeinsparung.

  • Ein Nicht-Null-Wert, der in einer Spalte von GUID (UniqueIdentifier) ​​ gespeichert ist, beträgt 16 Byte + 4 Byte = 20 Byte. Wenn also nur 50% NULL sind, bedeutet dies immer noch eine Nettoeinsparung.

Die "erwarteten Einsparungen" hängen also stark davon ab, worüber kind der Spalte, von der wir sprechen, und Ihre Schätzung des Verhältnisses zwischen Null und Nicht-Null liegt. Spalten mit variabler Breite (Varchars) sind wahrscheinlich etwas schwieriger vorherzusagen.

Diese Books Online-Seite hat eine Tabelle, in der angegeben ist, wie viel Prozent verschiedener Datentypen null sein müssen, damit Sie einen Vorteil erhalten.

Also Wann solltest du eine Sparse Column verwenden? Wenn Sie erwarten, dass ein erheblicher Prozentsatz der Zeilen einen NULL-Wert hat. Einige Beispiele, die mir in den Sinn kommen:

  • Eine Spalte "Order Return Date" in einer Auftragstabelle. Sie würden hoffen, dass ein sehr kleiner Prozentsatz des Umsatzes zu zurückgegebenen Produkten führen würde.
  • Eine "4th Address" - Zeile in einer Adresstabelle. Die meisten Mailadressen, auch wenn Sie einen Abteilungsnamen und ein "Care Of" benötigen, benötigen wahrscheinlich keine 4 separaten Zeilen.
  • Eine Spalte "Suffix" in einer Kundentabelle. Ein relativ geringer Prozentsatz der Menschen hat eine "jr." oder "III" oder "Esquire" nach ihrem Namen.
83
BradC
  • Das Speichern einer Null in einer spärlichen Spalte nimmt keinen Platz ein.

  • Für jede externe Anwendung verhält sich die Spalte gleich

  • Sparse Spalten funktionieren sehr gut mit gefilterten Indizes, da Sie nur einen Index erstellen möchten, um die nicht leeren Attribute in der Spalte zu behandeln.

  • Sie können einen Spaltensatz über den Spalten mit geringer Dichte erstellen, der einen XML-Clip aller Nicht-Null-Daten aus den von dem Satz abgedeckten Spalten zurückgibt. Die Spaltengruppe verhält sich wie eine Spalte. Hinweis: Sie können nur eine Spalte pro Tabelle festlegen.

  • Die Datenerfassungsfunktion und die Transaktionsreplikation funktionieren zwar, nicht jedoch die Spaltensatzfunktion.

Schattenseiten

  • Wenn eine spärliche Spalte Daten enthält, benötigt sie 4 Bytes mehr als eine normale Spalte, z. selbst ein Bit (normalerweise 0,125 Bytes) beträgt 4,125 Bytes, und die eindeutige Kennung steigt von 16 Bytes auf 20 Bytes.

  • Nicht jeder Datentyp kann spärlich sein: Text, Ntext, Bild, Zeitstempel, benutzerdefinierter Datentyp, Geometrie oder Geografie oder Varbinray (max) mit dem Attribut FILESTREAM können nicht spärlich sein. (Changed17/5/2009 danke Alex, dass er den Tippfehler entdeckt hat)

  • berechnete Spalten dürfen nicht spärlich sein (obwohl spärliche Spalten in einer anderen berechneten Spalte an einer Berechnung teilnehmen können)

  • Sie können keine Regeln anwenden oder Standardwerte haben.

  • Sparse-Spalten können nicht Teil eines Cluster-Indexes sein. Wenn Sie dies tun müssen, verwenden Sie eine berechnete Spalte, die auf der spärlichen Spalte basiert, und erstellen Sie den gruppierten Index für diese (welche Art von Objekt besiegt).

  • Mergereplikation funktioniert nicht.

  • Die Datenkomprimierung funktioniert nicht.

  • Der Zugriff (Lesen und Schreiben) auf spärliche Spalten ist zwar teurer, aber ich konnte keine genauen Zahlen dazu finden.

Referenz

23
rahul

Sie lesen es falsch - es braucht niemals 4x den Platz. 

Im Einzelnen heißt es 4 * (4 Bytes, siehe Fußnote), nicht 4x (mit 4 multiplizieren). Der einzige Fall, bei dem genau das Vierfache der Speicherplatz ist, ist ein Zeichen (4). Dies würde Einsparungen bewirken, wenn die NULL-Werte zu mehr als 64% der Zeit vorhanden sind.

"* Die Länge entspricht dem Durchschnitt der Daten, die im Typ enthalten sind, plus 2 oder 4 Byte."

3
mbourgon
| datetime NULL      | datetime SPARSE NULL | datetime SPARSE NULL |
|--------------------|----------------------|----------------------|
| 20171213 (8 bytes) | 20171213 (12 bytes)  | 20171213 (12 bytes)  |
| NULL     (8 bytes) | 20171213 (12 bytes)  | 20171213 (12 bytes)  |
| 20171213 (8 bytes) | NULL      (0 bytes)  | NULL      (0 bytes)  |
| NULL     (8 bytes) | NULL      (0 bytes)  | NULL      (0 bytes)  |

Sie verlieren 4 Bytes nicht nur einmal pro Zeile. aber für jede Zelle in der Zeile, die nicht null ist.

0
Ian Boyd