it-swarm.com.de

Nehmen leere Spalten Platz in einer Tabelle ein?

Ich habe Tabelle, die von sehr grundlegenden Informationen enthält. Nur ein Titel und ein paar Datumsfelder. Es gibt ein Feld namens Kommentare, das varchar (4000) ist. Meistens lassen wir es leer, aber manchmal wird hier eine große Datenmenge eingegeben. Ist das ein wirklich schlechtes Design? Oder ist das nur etwas ineffizient?

Ich würde annehmen, dass das Erstellen einer separaten Tabelle für diese Spalte besser wäre.

hinweis: Dies ist SQL Server 2008

enter image description here

21
aron

Um eine besser vorhersehbare Leistung zu erzielen (und um eine große Variation der Zeilen pro Seite zu vermeiden), würde ich diese Daten in einer verwandten Tabelle speichern - insbesondere, wenn sie nur zu einem kleinen Prozentsatz der Zeit ausgefüllt sind und insbesondere, wenn sie nur abgerufen werden einige der Fragen. Die Zeilen, in denen dieser Wert NULL ist, tragen zwar zum Speicherplatzaufwand bei, dies ist jedoch minimal. Wichtiger ist, wie eine Seite möglicherweise nur in zwei Zeilen und die nächste Seite in 500 Zeilen passt - dies kann sich wirklich auf die Statistik auswirken, und Sie sollten dies besser aufteilen, damit es separat gespeichert wird und nicht alle Ihre Vorgänge beeinflusst die Kerntabelle.

9
Aaron Bertrand

Es benötigt nur minimalen Platz, wenn es nicht verwendet wird

  • ein Bit in der NULL-Bitmap
  • zwei Bytes für die Länge (die bei NULL Null ist)

Der Overhead ist minimal und die Optimierung ist verfrüht.

Bis Sie wissen, dass Sie ein Problem haben, bewahren Sie es einfach in einer Tabelle auf. Sie unterbrechen KISS, indem Sie äußere Verknüpfungen einführen und einen zusätzlichen Aufwand bei der Abfrage der Daten hinzufügen.

Siehe https://stackoverflow.com/questions/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-8000-per-varchar-nvarchar-valu/3793265 # 3793265 für mehr

12
gbn

Ich denke, eine separate Tabelle wäre besser, um die Seitendichte zu verbessern und die Fragmentierung zu verringern, insbesondere wenn Sie dieses Feld nicht immer ausfüllen.

  • Eine Datenseite enthält ungefähr 8000 Bytes
  • Sie haben einige Zeilen mit beispielsweise 100 Bytes und einige Zeilen mit über 4000 Bytes
  • Diese langen Zeilen befinden sich auf einer Seite für sich, und der Rest der Seite ist "verschwendeter" Speicherplatz, den Ihre Datenbank belegt, aber wahrscheinlich niemals Daten enthält
  • Wenn Sie diesem langen Feld Daten für einen Datensatz auf einer größtenteils vollständigen Seite hinzufügen, wird die Seite wahrscheinlich überlaufen und es wird ein Zeiger auf die Seite mit dem Rest des Datensatzes angezeigt

All diese leeren Seiten und Zeiger führen zu einer schlechten Leistung. Normalisieren Sie dieses Feld, wenn Sie können.

11
JNK

Diese Frage sieht sehr ähnlich aus: Beeinflussen zusätzliche leere Spalten die Größe der SQL-Tabelle erheblich?

Es sieht so aus, als ob die Antwort lautet: Ja, es nimmt Platz ein, aber es gibt einen Komprimierungsalgorithmus für Spalten mit vielen Nullwerten.

In Bezug auf das Design denke ich, dass eine damit verbundene externe Tabelle ein saubereres Design wäre. Eine Spalte mit häufigen Nullwerten erschwert es den Benutzern der Datenbank, da sie versehentlich einen Nullwert verwenden könnten, wenn sie nicht vorsichtig sind. Daher müsste der Code, der die Datenbank verwendet, eine Fehlerprüfung enthalten und wird von dort aus nur hässlich.

4
hbtest

Es wird Ihnen gut gehen - es ist bereits eine Varchar-Spalte, daher wird nur dann Speicherplatz verwendet, wenn sie Daten enthält. Wenn Sie viele nullfähige Spalten mit fester Größe wie int hatten, können Probleme mit der Speicherplatznutzung auftreten.

Soweit ich es auf einen anderen Tisch stelle, würde ich mich nicht darum kümmern. Sie können sich auch die Verwendung von varchar (max) und die Optionen für In/Out-Zeilen ansehen. Auch dies ist wahrscheinlich verfrüht.

2
Cade Roux