2013-02-06 8 views
5

Ich habe eine MS SQL Server 2008-Datenbank auf einem Shared Hosting und ich muss den verwendeten Speicherplatz so viel wie möglich reduzieren. Meine größte Tabelle hat die folgende Definition:Zeile Größe Overhead

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 von Bytes pro Datensatz in meinem Tisch, um herauszufinden. Nach der Theorie sollte die Größe: 4B (Zeilenkopf) + 2B (smallint) + 4B (smalldatetime) + 2B (smallint), was 12 Bytes ist.

Allerdings, wenn ich den Befehl lautete:

dbcc showcontig ('stage') with tableresults 

Es zeigt: MinimumRecordSize = 15, MaximumRecordSize = 15 So nach SQL Server, die Bytes pro Datensatz ist 15 und nicht 12 Die Zahl 15 Bytes pro Datensatz scheint auch korrekt zu sein, wenn ich mir den gesamten Speicherplatz anschaue, den die Tabelle einnimmt, und sie nach der Anzahl der Zeilen dividiere.

Was nimmt die 3 zusätzlichen Bytes ???

Antwort

5

Diese 3 zusätzlichen stammen aus der NULL-Bitmap. According to Paul's post, es ist in jeder Zeile außer denen, die alle SPARSE über die Spalten sind (beginnend in SQL Server 2008).

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

+0

Vielen Dank für die Erklärung. So scheint es, dass es in meinem Fall unmöglich ist, den Zeilenaufwand in SQL Server 2008 auf weniger als 7 Byte zu reduzieren. – jirikadlec2

1

Ich stimme teilweise mit @Matt überein, die 2 Bytes sind für NULL-Bitmap erforderlich, die 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 1 Byte genommen.