SQL सर्वर इन आँकड़ों को किसी और चीज़ से अपडेट करने से मना क्यों करता है?


13

मैंने एक दैनिक डेटवेयरहाउस निर्माण में अपेक्षाकृत लंबे समय तक चलने (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 में अपग्रेड करने के बाद अब यह समस्या ठीक हो गई है।

जवाबों:


10

पहली चीज़ जो मैं कोशिश करूँगा कि SQL सर्वर आवृत्ति SP1 के CU16 से QFE के साथ अद्यतन कर रहा है, जो कि अभी आपके पास है, SP3 CU1 (वर्तमान 2012 बिल्ड) के लिए, फिर यह देखने के लिए कि क्या व्यवहार समान है।

उदाहरण के लिए:

FIX: अद्यतन सांख्यिकी SQL सर्वर में कॉलमस्टोर इंडेक्स वाली तालिका के लिए गलत नमूनाकरण और प्रसंस्करण करता है

... SP2 CU2 में पहली बार प्रासंगिक हो सकता है।

कहा कि, मुझे यकीन नहीं है कि अगर 2012 के कॉलमस्टोर समर्थित टेबलप्ले का समर्थन किया जाता है, तो नमूना आंकड़ों के लिए आवश्यक है। प्रश्न में एक रिप्रो उपलब्ध होने पर मैं इस उत्तर को अपडेट करूंगा।


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

2
हां यह निश्चित रूप से बाद के संस्करणों में तय की गई चीज की तरह दिखता है। मैंने यहाँ pastebin.com/7f4TwmKW एक साधारण रिप्रो का उत्पादन किया और 11.0.5343.0 पर चलने वाले एक परीक्षण सर्वर पर 10,000 पंक्तियों के नमूने के आकार के लिए मेरे अनुरोध को अनदेखा कर दिया गया और सभी 8,000,000 पंक्तियों को नमूना लिया गया i.stack .imgur.com/DbbjZ.png (योजना) प्रश्न में एक जैसा ही) - लेकिन मैं इसे Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (पंक्तियों की संख्या 274,649 है, जो पंक्तियों की अनुमानित संख्या के बहुत करीब है, पर नहीं मिलता है) पहले का निर्माण और योजना स्तंभ के बजाय CI का उपयोग करती है।)
मार्टिन स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.