मेरे पास एक सामान्य लॉग टेबल है, लगभग 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 पर लागू हुआ । अब मेरी तालिका डेटा स्पेस में लगभग sp_spaceused
1.8Gb लेती है , जैसा कि रिपोर्ट किया गया है , जबकि स्पर्स करने से पहले यह 1Gb था।
मैंने कोशिश की dbcc cleantable
, लेकिन इसका कोई असर नहीं हुआ।
फिर dbcc shrinkdatabase
, कोई प्रभाव भी नहीं।
हैरान, मैंने हटा दिया SPARSE
और दोहराया dbcc
। तालिका का आकार 1.8Gb पर रहा।
क्या देता है?
rowid int not null identity(1,1) primary key clustered
।