Ich habe eine generische Protokolltabelle, ungefähr 5 Millionen Zeilen.
Es gibt ein "stark typisiertes" Feld, in dem der Ereignistyp gespeichert ist, und eine Reihe von "lose typisierten" Spalten, die für das Ereignis relevante Daten enthalten. Das heißt, die Bedeutung dieser "lose typisierten" Spalten hängt von der Art des Ereignisses ab.
Diese Spalten sind definiert als:
USER_CHAR1 nvarchar(150) null,
USER_CHAR2 nvarchar(150) null,
USER_CHAR3 nvarchar(150) null,
USER_CHAR4 nvarchar(150) null,
USER_CHAR5 nvarchar(150) null,
USER_INTEGER1 int null,
USER_INTEGER2 int null,
USER_INTEGER3 int null,
USER_INTEGER4 int null,
USER_INTEGER5 int null,
USER_FLAG1 bit null,
USER_FLAG2 bit null,
USER_FLAG3 bit null,
USER_FLAG4 bit null,
USER_FLAG5 bit null,
USER_FLOAT1 float null,
USER_FLOAT2 float null,
USER_FLOAT3 float null,
USER_FLOAT4 float null,
USER_FLOAT5 float null
Die Spalten 1 und 2 in jedem Typ werden häufig verwendet, aber ab Nummer 3 würden nur sehr wenige Ereignistypen so viele Informationen liefern. Ich habe mich daher entschlossen, die Spalten 3-5 in jedem Typ als zu markieren SPARSE
.
Ich habe zuerst eine Analyse durchgeführt und festgestellt, dass tatsächlich mindestens 80% der Daten in jeder dieser Spalten null
und in etwa 100% der Daten vorhanden sind null
. Nach der 40% Einsparung Schwellenwerttabelle , SPARSE
wäre ein großer Gewinn für sie sein.
Also habe ich mich SPARSE
in jeder Gruppe für die Spalten 3-5 beworben . Jetzt nimmt meine Tabelle ungefähr 1,8 GB Datenraum ein, wie von angegeben sp_spaceused
, während sie vor dem Sparsing 1 GB betrug.
Ich habe es versucht dbcc cleantable
, aber es hatte keine Wirkung.
Dann dbcc shrinkdatabase
auch keine Wirkung.
Verwirrt entfernte ich SPARSE
das dbcc
s und wiederholte es . Die Größe der Tabelle blieb bei 1,8 GB.
Was gibt?
rowid int not null identity(1,1) primary key clustered
.