У мене є загальна таблиця журналів, близько 5м рядків.
Існує "сильно набране" поле, яке зберігає тип події, і купа стовпців, що "втратили", які містять дані, що стосуються події. Тобто, значення цих стовпців, що «набирають текст», залежить від типу події.
Ці стовпці визначаються як:
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
Стовпці 1 і 2 в кожному типі широко використовуються, але, починаючи з числа 3, дуже мало типів подій надають цю інформацію. Тому я вирішив позначити колонки 3-5 у кожному типі як SPARSE
.
Я спершу зробив деякий аналіз і побачив, що, дійсно, щонайменше 80% даних у кожному з цих стовпців є null
, а в деяких 100% - це null
. Згідно таблиці 40-відсоткового порогового рівня заощаджень , SPARSE
це буде величезною виграшею для них.
Тому я пішов і подав заявки SPARSE
на колонки 3-5 у кожній групі. Тепер мій стіл займає близько 1,8 Гб в просторі даних, як повідомлялося sp_spaceused
, тоді як до спарингу він був 1 Гбіт.
Я спробував dbcc cleantable
, але це не мало ефекту.
Тоді dbcc shrinkdatabase
і ефекту немає.
Спантеличений, я зняв SPARSE
і повторив dbcc
s. Розмір столу залишився на рівні 1,8 Гб.
Що дає?
rowid int not null identity(1,1) primary key clustered
.