Ich bin für die Erstellung einer Datenbank für ein Projekt verantwortlich. Wir haben Felder, die selten einen Wert haben (1 von 10.000 Datensätzen), und ich versuche, den besten Weg zu finden, dies in der Datenbank zu speichern.
Soweit ich sehen kann, habe ich 3 Möglichkeiten:
- Fügen Sie für jeden zusätzlichen Wert eine Spalte in die Tabelle ein
- Fügen Sie eine verknüpfte Tabelle hinzu, die auf die Originaltabelle verweist und nur dort Datensätze enthält, wo ein Wert gespeichert werden muss
- Verwenden Sie den XML-Datentyp in der Originaltabelle und speichern Sie alle darin enthaltenen Werte.
Gibt es andere Optionen, die ich nicht berücksichtigt habe?
Ich versuche, die Vor- und Nachteile jeder Methode herauszufinden. Soweit ich das beurteilen kann, ist 1 die einfachste und 2 die platzsparendste, aber ich habe Mühe, viele Ressourcen für 3 zu finden.
sql-server-2008
xml
Matthew Steeples
quelle
quelle
Antworten:
Klingt wie das, was Sie brauchen, ist spärliche Spalten und gefilterte Indizes und gehört zu Option 1. Dies sind vollständig unterstützte und dokumentierte Funktionen für genau dieses Szenario.
Ich kann mir keine XML-Lösung vorstellen, die in diesem Szenario eine gute Leistung erbringt, einen enormen Overhead an redundanten Metadaten aufweist und nur langsam abfragbar ist.
quelle
Eine nullfähige Spalte nimmt bei variabler Länge in SQL Server kein Leerzeichen ein. Die Tatsache, NULL zu sein, wird in der NULL-Bitmap gespeichert . Sie können es bei Bedarf mit gefilterten Indizes indizieren, sodass Sie NULL-Spalten ignorieren.
Fügt Komplexität hinzu, wenn Sie Punkt 1 berücksichtigen.
Nicht. Schwer zu suchen, zu analysieren usw. Sie werden es später bereuen
Es kommt auch auf die Größe an: Wird dies für ein paar Milliarden Zeilen char (1000) sein? Oder tinyint für 100k Zeilen? Wenn letztere die zusätzliche Komplexität von Punkt 2 berücksichtigen: es lohnt sich nicht.
quelle
Mit SQL Server 2008 haben Sie zusätzlich die Möglichkeit, Spalten mit geringer Dichte zu verwenden, die speziell für die von Ihnen erwähnte Situation entwickelt wurden.
Sie haben den zusätzlichen Vorteil, dass Sie sie mit XML COLUMN_SET als kombiniertes XML-Objekt anzeigen oder einzeln referenzieren können, und sie bieten eine enorme Platzersparnis.
Weitere Informationen finden Sie im folgenden Blog-Artikel: http://www.sqlskills.com/BLOGS/PAUL/post/SQL-Server-2008-Sparse-columns-and-XML-COLUMN_SET.aspx
quelle
Eine vierte Option: Verwenden Sie keine Tabellen. Tabellen sind für diese Art von Daten sehr schlecht geeignet (in der Tat für jede Art von Daten, die nicht in Tabellenform eingepasst wurden). Verwenden Sie einfach XML.
quelle