Wenn Sie versuchen, Ihre Tabelle ohne die gruppierte PK-Einschränkung zu erstellen, wird ein etwas anderer Fehler angezeigt:
Meldung 1701, Ebene 16, Status 1, Zeile 1 Das Erstellen oder Ändern der Tabelle 'Mytable' ist fehlgeschlagen, da die minimale Zeilengröße 8067 betragen würde, einschließlich 1530 Byte internem Overhead. Dies überschreitet die maximal zulässige Tabellenzeilengröße von 8060 Byte.
In dieser Fehlermeldung sehen Sie, dass 1530 Byte interner Overhead für die Seitenkomprimierung vorhanden sind.
Jetzt können Sie rechnen:
- 8 Bytes für
bigint
MyTableID
- 4 Bytes für
int
LastColumn
- 9 Bytes für jede der 593
numeric(19,4)
Spalten (insgesamt 5337 Bytes)
- 1530 Byte Komprimierungsaufwand
Also, 8 + 4 + (593 * 9) + 1530 = 6879. Moment
mal ... Das ist immer noch unter 8060. Was ist damit los?!
Der Seitenkomprimierungsalgorithmus stapelt tatsächlich mehrere Komprimierungsalgorithmen zusammen. Der erste Schritt besteht darin, die ROW-Komprimierung anzuwenden. Der Overhead der Zeilenkomprimierung ist nicht in den in dieser Fehlermeldung aufgeführten 1530 Bytes Overhead enthalten.
Weitere Informationen zur Funktionsweise der Zeilenkomprimierung finden Sie hier in meinem Blog und hier in BOL . Sie werden im BOL-Artikel feststellen, dass der numeric
Speicher als "Dieser Speicher entspricht genau dem vardezimalen Speicherformat" beschrieben wird, dies wird jedoch nicht erläutert vardecimal
. Dieser Beitrag behandelt vardecimal
etwas mehr - im Wesentlichen werden 2 Byte Overhead pro Spalte hinzugefügt, um die tatsächliche Länge zu speichern (ähnlich wie bei der varchar
Ausführung).
Die Zeilenkomprimierung erfordert zusätzliche 2 Bytes für jede der 593 numeric
Spalten sowie die bigint
und int
erfordert jeweils 1 Byte Overhead.
Die zeilenkomprimierten Speicheranforderungen wären:
- 8 Bytes + 1 Byte Overhead für
bigint
MyTableID
- 4 Bytes + 1 Byte Overhead für
int
LastColumn
- 9 Bytes + 2 Bytes Overhead für jede der 593
numeric(19,4)
Spalten
- 1188 Byte ROW-Komprimierungsaufwand
8 + 4 + (593 * 9) = 5349 Byte Daten
1 + 1 + (593 * 2) = 1188 Byte Zeilenkomprimierungsaufwand
Insgesamt 6537 Byte für zeilenkomprimiertes Schema
Nachdem wir die Zeilengröße für das zeilenkomprimierte Schema haben, können wir unsere Mathematik erneut überprüfen. Die seitenkomprimierte Zeilengröße entspricht der Datengröße + dem Zeilenkomprimierungsaufwand + dem Seitenkomprimierungsaufwand:
- 8 Bytes für
bigint
MyTableID
- 4 Bytes für
int
LastColumn
- 9 Bytes für jede der 593
numeric(19,4)
Spalten
- 1188 Byte ROW-Komprimierungsaufwand
- 1530 Byte PAGE-Komprimierungsaufwand
5349 Bytes Daten
+ 1188 Byte Zeilenkomprimierungsaufwand
+ 1530 Bytes Seitenkomprimierungsaufwand
8067 Bytes insgesamt