मैंने एक दैनिक डेटवेयरहाउस निर्माण में अपेक्षाकृत लंबे समय तक चलने (20 मिनट +) ऑटो अपडेट सांख्यिकी संचालन पर ध्यान दिया। शामिल मेज है
CREATE TABLE [dbo].[factWebAnalytics](
[WebAnalyticsId] [bigint] IDENTITY(1,1) NOT NULL,
[MarketKey] [int] NOT NULL CONSTRAINT [DF_factWebAnalytics_MarketKey] DEFAULT ((-1)),
/*Other columns removed*/
CONSTRAINT [PK_factWebAnalytics] PRIMARY KEY CLUSTERED
(
[MarketKey] ASC,
[WebAnalyticsId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [MarketKeyPS]([MarketKey])
) ON [MarketKeyPS]([MarketKey])
यह Microsoft SQL Server 2012 (SP1) - 11.0.3513.0 (X64) पर चल रहा है, इसलिए लिखने योग्य कॉलमस्टोर इंडेक्स उपलब्ध नहीं है।
तालिका में दो अलग-अलग मार्केट कुंजियों का डेटा है। बिल्ड एक विशिष्ट MarketKey के लिए एक स्टेजिंग टेबल के लिए विभाजन को स्विच करता है, कॉलमस्टोर इंडेक्स को निष्क्रिय करता है, आवश्यक लेखन करता है, कॉलमस्टोर को फिर से बनाता है, फिर इसे वापस स्विच करता है।
अद्यतन आँकड़ों की निष्पादन योजना यह दर्शाती है कि यह तालिका से सभी पंक्तियों को खींचती है, उन्हें छाँटती है, पंक्तियों की अनुमानित संख्या को गलत तरीके से प्राप्त करती है और फैल tempdbस्तर 2 के साथ फैल जाती है।
चल रहा है
SELECT [s].[name] AS "Statistic",
[sp].*
FROM [sys].[stats] AS [s]
OUTER APPLY sys.dm_db_stats_properties ([s].[object_id], [s].[stats_id]) AS [sp]
WHERE [s].[object_id] = OBJECT_ID(N'[dbo].[factWebAnalytics]');
दिखाता है
यदि मैं स्पष्ट रूप से उस सूचकांक के आँकड़ों के नमूने के आकार को कम करने की कोशिश करता हूँ और दूसरों के साथ प्रयोग करता हूँ
UPDATE STATISTICS [dbo].[factWebAnalytics] [PK_factWebAnalytics] WITH SAMPLE 897667 ROWS
क्वेरी 20 मिनट + फिर से चलती है और निष्पादन योजना से पता चलता है कि यह अनुरोधित सभी पंक्तियों को संसाधित कर रहा है न कि 897,667 नमूना।
इस सब के अंत में उत्पन्न आँकड़े बहुत दिलचस्प नहीं हैं और निश्चित रूप से एक पूर्ण स्कैन पर खर्च किए गए समय को वारंट नहीं करते हैं।
Statistics for INDEX 'PK_factWebAnalytics'.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Name Updated Rows Rows Sampled Steps Density Average Key Length String Index
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PK_factWebAnalytics Jan 22 2016 11:31AM 420072086 420072086 2 0 12 NO 420072086
All Density Average Length Columns
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0.5 4 MarketKey
2.380544E-09 12 MarketKey, WebAnalyticsId
Histogram Steps
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 0 3.441652E+08 0 1
2 0 7.590685E+07 0 1
कोई भी विचार क्यों मैं इस व्यवहार का सामना कर रहा हूं और NORECOMPUTEइन पर उपयोग करने के अलावा मैं और क्या कदम उठा सकता हूं ?
एक रेप्रो स्क्रिप्ट है । यह बस एक संकुल पीके और एक कॉलमस्टोर इंडेक्स के साथ एक तालिका बनाता है और कम नमूना आकार के साथ पीके आँकड़े को अपडेट करने की कोशिश करता है। यह विभाजन का उपयोग नहीं करता है - यह दर्शाता है कि विभाजन पहलू की आवश्यकता नहीं है। हालाँकि, ऊपर वर्णित विभाजन का उपयोग मामलों को विभाजन को स्विच करने के रूप में बदतर बनाता है और फिर इसे (यहां तक कि अन्य परिवर्तनों के बिना भी) में स्विच करना विभाजन में पंक्तियों की संख्या को दोगुना करके modification_counter को बढ़ाएगा, इस प्रकार व्यावहारिक रूप से गारंटी देता है कि आंकड़े होंगे बासी और ऑटो अद्यतन माना जाता है।
मैंने KB2986627 में दर्शाए अनुसार तालिका में एक गैर क्लस्टर सूचकांक जोड़ने की कोशिश की है (दोनों बिना पंक्तियों के साथ फ़िल्टर किए गए और फिर, जब वह विफल हो गया, तो एक गैर फ़िल्टर एनसीआई भी बिना किसी प्रभाव के)।
रेप्रो ने 11.0.6020.0 बिल्ड पर समस्याग्रस्त व्यवहार नहीं दिखाया और एसपी 3 में अपग्रेड करने के बाद अब यह समस्या ठीक हो गई है।


SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsIdमेरे लिए 30 सेकंड से भी कम समय में चलता है। हालांकि यह कॉलमस्टोर इंडेक्स का उपयोग नहीं करता है। यह क्लस्टर किए गए इंडेक्स का उपयोग करता है।