Ich habe eine Tabelle mit 490 M Zeilen und 55 GB Tabellenbereich, also ca. 167 Bytes pro Zeile. Die Tabelle enthält drei Spalten: a VARCHAR(100)
, a DATETIME2(0)
und a SMALLINT
. Die durchschnittliche Länge des Textes in dem VARCHAR
Feld beträgt ungefähr 21,5, daher sollten die Rohdaten ungefähr 32 Bytes pro Zeile betragen: 22 + 2 für die Ganzzahl VARCHAR
, 6 für die DATETIME2
Ganzzahl und 2 für die 16-Bit-Ganzzahl.
Beachten Sie, dass das oben stehende Leerzeichen nur Daten und keine Indizes sind. Ich verwende den unter Eigenschaften | gemeldeten Wert Lagerung | Allgemein | Datenraum.
Natürlich muss es etwas Overhead geben, aber 135 Bytes pro Zeile scheinen viel zu sein, besonders für eine große Tabelle. Warum könnte das so sein? Hat noch jemand ähnliche Multiplikatoren gesehen? Welche Faktoren können den zusätzlichen Platzbedarf beeinflussen?
Zum Vergleich habe ich versucht, eine Tabelle mit zwei INT
Feldern und 1 M Zeilen zu erstellen . Der erforderliche Datenraum betrug 16,4 MB: 17 Byte pro Zeile im Vergleich zu 8 Byte Rohdaten. Eine andere Testtabelle mit einem INT
und VARCHAR(100)
mit dem gleichen Text wie die reale Tabelle belegt 39 Bytes pro Zeile (44 K Zeilen), wobei ich 28 plus ein wenig erwarten würde.
Der Produktionstisch hat also erheblich mehr Overhead. Liegt das daran, dass es größer ist? Ich würde erwarten, dass die Indexgrößen ungefähr N * log (N) betragen, aber ich verstehe nicht, warum der für die tatsächlichen Daten erforderliche Speicherplatz nicht linear ist.
Vielen Dank im Voraus für alle Hinweise!
BEARBEITEN:
Alle aufgeführten Felder sind NOT NULL
. Die reale Tabelle hat eine gruppierte PK auf dem VARCHAR
Feld und dem DATETIME2
Feld in dieser Reihenfolge. Für die beiden Tests war der erste INT
der (gruppierte) PK.
Wenn es darauf ankommt: Die Tabelle ist eine Aufzeichnung der Ping-Ergebnisse. Die Felder sind URL, Ping-Datum / Uhrzeit und Latenz in Millisekunden. Daten werden ständig angehängt und nie aktualisiert, aber die Daten werden regelmäßig gelöscht, um sie auf wenige Datensätze pro Stunde und URL zu reduzieren.
BEARBEITEN:
Eine sehr interessante Antwort hier , dass schon sagt, für einen Index mit viel Lesen und Schreiben, Wiederaufbau kann nicht von Vorteil sein. In meinem Fall ist der belegte Speicherplatz ein Problem, aber wenn die Schreibleistung wichtiger ist, kann es sein, dass man mit schlaffen Indizes besser dran ist.
quelle
VARCHAR
s in meiner obigen Schätzung berücksichtigt , aber nicht die Anzahl der Spalten. Diese Tabelle hat keine NULL-fähigen Felder (hätte das erwähnen sollen), weist sie ihnen immer noch Bytes zu?Haben sich die Datentypen im Laufe der Zeit geändert? Wurden Spalten mit variabler Länge entfernt? Wurden die Indizes häufig defragmentiert, aber nie neu erstellt? Wurden viele Zeilen gelöscht oder wurden viele Spalten mit variabler Länge erheblich aktualisiert? Einige gute Diskussionen hier .
quelle
VARCHAR
undDATETIME2
Felder, in dieser Reihenfolge. Die Einfügungen werden für das erste Feld gleichmäßig verteilt. Für das zweite Feld werden neue Werte und immer größer als alle vorhandenen.