Tôi có một bảng nhật ký chung, khoảng 5m hàng.
Có một trường "được gõ mạnh" lưu trữ loại sự kiện và một loạt các cột "được gõ một cách thất bại" có chứa dữ liệu liên quan đến sự kiện. Đó là, ý nghĩa của các cột "gõ một cách thất bại" phụ thuộc vào loại sự kiện.
Các cột này được định nghĩa là:
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
Cột 1 và 2 trong mỗi loại được sử dụng nhiều, nhưng bắt đầu từ số 3, rất ít loại sự kiện sẽ cung cấp nhiều thông tin này. Do đó, tôi đã quyết định đánh dấu các cột 3-5 trong mỗi loại là SPARSE
.
Tôi đã thực hiện một số phân tích đầu tiên và thấy rằng, thực sự, ít nhất 80% dữ liệu trong mỗi cột đó là null
, và trong một số 100% dữ liệu là null
. Theo bảng ngưỡng tiết kiệm 40% , SPARSE
sẽ là một chiến thắng rất lớn đối với họ.
Vì vậy, tôi đã đi và áp dụng SPARSE
cho các cột 3-5 trong mỗi nhóm. Bây giờ bảng của tôi mất khoảng 1,8Gb trong không gian dữ liệu như được báo cáo sp_spaceused
, trong khi trước khi phát hiện ra nó là 1Gb.
Tôi đã thử dbcc cleantable
, nhưng nó không có hiệu quả.
Sau đó dbcc shrinkdatabase
, cũng không có tác dụng.
Bối rối, tôi gỡ bỏ SPARSE
và lặp lại dbcc
s. Kích thước của bảng vẫn ở mức 1,8Gb.
Đưa cái gì?
rowid int not null identity(1,1) primary key clustered
.