Frage Zeilengröße Overhead


Ich habe eine MS SQL Server 2008-Datenbank auf einem Shared-Hosting und ich muss den genutzten Speicherplatz so weit wie möglich reduzieren. Meine größte Tabelle hat folgende Definition:

CREATE TABLE [stage](
    [station_id] [smallint] NOT NULL,
    [time_utc] [smalldatetime] NOT NULL,
    [stage_mm] [smallint] NOT NULL,
CONSTRAINT [PK_stage] PRIMARY KEY CLUSTERED ([station_id] ASC,[time_utc] ASC)

Ich habe versucht, die durchschnittliche Anzahl der Bytes pro Datensatz in meiner Tabelle herauszufinden. Theoretisch sollte die Größe sein: 4B (Zeilenkopf) + 2B (Smallint) + 4B (Smalldatetime) + 2B (Smallint), was 12 Bytes ist.

Wenn ich jedoch den Befehl ausgeführt habe:

dbcc showcontig ('stage') with tableresults

Es zeigt: MinimumRecordSize = 15, MaximumRecordSize = 15 Laut SQL Server sind die Bytes pro Datensatz also 15 und nicht 12 Die Anzahl 15 Byte pro Datensatz scheint auch korrekt zu sein, wenn ich den gesamten Speicherplatz der Tabelle betrachte und ihn nach Anzahl der Zeilen dividiere.

Was nimmt die 3 zusätzlichen Bytes ???


5
2018-02-06 00:06


Ursprung


Antworten:


Diese 3 zusätzlichen stammen aus der NULL-Bitmap. Laut Pauls Beitrag, es ist in jeder Zeile außer für diejenigen, die alle SPARSE über die Spalten sind (beginnend in SQL Server 2008).

Und nach einer Zeile in dieser BOL Beitrag, die NULL Bitmap ist = 2 + ((number_columns_in_clustered_index + 7) / 8). In deinem Fall, 3.


6
2018-02-06 00:32



Ich stimme teilweise mit @Matt überein, die 2 Bytes sind für NULL-Bitmap erforderlich, was korrekt ist.

Das letzte Byte wird jedoch von der Anzahl der Spalten pro Bit verbraucht. Bedeutung, wenn ich 6 Spalten in meiner Tabelle habe, dann benötige ich 1 Byte (6 Bits), oder wenn ich 12 Spalten habe, dann benötige ich 2 Bytes (12 Bits).

In Ihrem Fall gibt es 3 Spalten daher hat es nur gedauert 1 Byte.


1
2017-08-18 13:42