संचालक ने स्पिल स्तर 2 के साथ निष्पादन के दौरान डेटा को फैलाने के लिए tempdb का उपयोग किया


18

मैं चेतावनी के साथ एक प्रश्न योजना पर तरह आपरेशन की लागत कम करने के लिए संघर्ष कर रहा हूँ Operator usedtempdbto spill data during execution with spill level 2

मुझे स्पिल स्तर 1 के साथ निष्पादन के दौरान स्पिल डेटा से संबंधित कई पोस्ट मिली हैं , लेकिन लेवल 2 नहीं है। लेवल 1 के कारण बू आउटडेटेड आँकड़े प्रतीत होते हैं , लेवल 2 के बारे में क्या? मुझे इससे संबंधित कुछ भी नहीं मिला level 2

मुझे यह लेख क्रमबद्ध चेतावनियों से संबंधित बहुत दिलचस्प लगा:

SQL सर्वर में एक सॉर्ट चेतावनी को कभी भी अनदेखा न करें

मेरा Sql सर्वर?

Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) जून 17 2016 19:14:09 कॉपीराइट (c) Microsoft NT एंटरप्राइज़ संस्करण (64-बिट) Windows NT 6.3 पर (बिल्ड 9600:) (हाइपरविजर)

मेरे हार्डवेयर?

हार्परवेयर खोजने के लिए नीचे क्वेरी चलाएं:

- SQL सर्वर 2012 से हार्डवेयर जानकारी

SELECT cpu_count AS [Logical CPU Count], hyperthread_ratio AS [Hyperthread Ratio],
cpu_count/hyperthread_ratio AS [Physical CPU Count], 
physical_memory_kb/1024 AS [Physical Memory (MB)], affinity_type_desc, 
virtual_machine_type_desc, sqlserver_start_time
FROM sys.dm_os_sys_info WITH (NOLOCK) OPTION (RECOMPILE);

यहाँ छवि विवरण दर्ज करें

वर्तमान में आवंटित स्मृति

SELECT
(physical_memory_in_use_kb/1024) AS Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024) AS Locked_pages_used_Sqlserver_MB,
(total_virtual_address_space_kb/1024) AS Total_VAS_in_MB,
process_physical_memory_low,
process_virtual_memory_low
FROM sys.dm_os_process_memory;

यहाँ छवि विवरण दर्ज करें

जब मैं अपनी क्वेरी को एक वर्ष के दायरे में चलाता हूं तो मुझे नीचे दी गई तस्वीर के अनुसार कोई चेतावनी नहीं मिलती है:

यहाँ छवि विवरण दर्ज करें

लेकिन जब मैं इसे केवल 1 दिन के दायरे में चलाता हूं तो मुझे यह चेतावनी मिलती है on the sort operator:

यहाँ छवि विवरण दर्ज करें

यह प्रश्न है:

    DECLARE @FromDate SMALLDATETIME = '19-OCT-2016 11:00'
    DECLARE @ToDate   SMALLDATETIME = '20-OCT-2016 12:00'




    SELECT      DISTINCT
                a.strAccountCode ,
                a.strAddressLine6 ,
                a.strPostalCode ,
                CASE    WHEN a.strCountryCode IN ('91','92') THEN 'GB-Int'
                        ELSE a.strCountryCode
                        END AS [strCountryCode]
    FROM        Bocss2.dbo.tblBAccountParticipant AS ap
    INNER JOIN  Bocss2.dbo.tblBAccountParticipantAddress AS apa ON ap.lngParticipantID = apa.lngParticipantID
                                                                AND apa.sintAddressTypeID = 2
    INNER JOIN  Bocss2.dbo.tblBAccountHolder AS ah ON ap.lngParticipantID = ah.lngParticipantID
    INNER JOIN  Bocss2.dbo.tblBAddress AS a ON apa.lngAddressID = a.lngAddressID
                                            AND a.blnIsCurrent = 1
    INNER JOIN  Bocss2.dbo.tblBOrder AS o ON ap.lngParticipantID = o.lngAccountParticipantID
                                        AND o.sdtmOrdCreated >= @FromDate
                                        AND o.sdtmOrdCreated < @ToDate

OPTION(RECOMPILE)

क्वेरी प्लान यहां है

pastetheplan का उपयोग करके क्वेरी योजना

प्रश्न: 1) क्वेरी प्लान में मैं इसे देखता हूं:

StatementOptmEarlyAbortReason="GoodEnoughPlanFound" CardinalityEstimationModelVersion="70" 

70 क्यों? मैं sql सर्वर 2014 का उपयोग कर रहा हूं

2) मैं उस प्रकार के ऑपरेटर से कैसे छुटकारा पाऊंगा (यदि संभव हो तो)?

3) मैंने इस सर्वर पर अधिक मेमोरी जोड़ने के अलावा, पेज लाइफ की उम्मीद को बहुत कम देखा है, क्या कोई अन्य चीज है जिसे मैं देख सकता हूं कि क्या मैं इस चेतावनी को रोक सकता हूं?

चियर्स

शैंकी और पॉल व्हाइट के जवाब के बाद अपडेट करें

मैंने नीचे दिए गए स्क्रिप्ट के अनुसार अपने आंकड़ों की जांच की है, और वे सभी सही और अपडेट किए गए लगते हैं।

ये सभी इस क्वेरी में उपयोग किए गए इंडेक्स और टेबल हैं।

DBCC SHOW_STATISTICS ('dbo.tblBAddress','IDXF_tblBAddress_lngAddressID__INC')
GO
DBCC SHOW_STATISTICS  ('dbo.tblBOrder','IX_tblBOrder_sdtmOrdCreated_INCL')
GO
DBCC SHOW_STATISTICS ('dbo.tblBAccountHolder','PK_tblAccountHolder')
GO
DBCC SHOW_STATISTICS ('dbo.tblBAccountParticipant','PK_tblBAccountParticipants')
GO
DBCC SHOW_STATISTICS ('dbo.tblBAccountParticipantAddress','IDXF_tblBAccountParticipantAddress_lngParticipantID')
GO

यह वही है जो मुझे वापस मिल गया है:

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

यह एक आंशिक परिणाम है, लेकिन मैंने उन सभी का फिर से दौरा किया है।

आँकड़ों के अद्यतन के लिए मेरे पास वर्तमान में ओला हॉलेनग्रेन है

सूचकांक ऑप्टिमाइज़ जॉब - सप्ताह में एक बार चलाने का कार्यक्रम - रविवार

EXECUTE [dbo].[IndexOptimize] 
@Databases = 'USER_DATABASES,-%Archive', 
@Indexes = 'ALL_INDEXES' , 
@FragmentationLow = NULL,
@FragmentationMedium = NULL,
@FragmentationHigh = NULL,
@PageCountLevel=1000,
@StatisticsSample =100
,@UpdateStatistics = 'Index', 
@OnlyModifiedStatistics = 'Y',
@TimeLimit=10800, 
@LogToTable = 'Y'

हालाँकि, आँकड़े अद्यतन किए जाने के बाद लग रहा था कि मैं निम्न स्क्रिप्ट चलाने के बाद, मुझे सॉर्ट ऑपरेटर पर अधिक चेतावनी नहीं मिली।

UPDATE STATISTICS [Bocss2].[dbo].[tblBOrder]  WITH FULLSCAN
--1 hour  04 min 14 sec

UPDATE STATISTICS [Bocss2].[dbo].tblBAddress  WITH FULLSCAN
-- 45 min 29 sec

UPDATE STATISTICS  [Bocss2].[dbo].tblBAccountHolder WITH FULLSCAN
-- 26 SEC

UPDATE STATISTICS  [Bocss2].[dbo].tblBAccountParticipant WITH FULLSCAN
-- 4 min

UPDATE STATISTICS  [Bocss2].[dbo].tblBAccountParticipantAddress WITH FULLSCAN
-- 7 min 3 sec

क्वेरी का समय कितना कम किया गया था?
प्रभावशाली

मैं कभी भी ऐसे समाधान को लागू नहीं कर सकता था जो मुझे ऐसी बड़ी तालिकाओं पर अद्यतन रखने की अनुमति दे। समाधान तालिकाओं को विभाजित करने और वृद्धिशील आंकड़ों का उपयोग करने के लिए होगा, लेकिन मैं इसे लागू करने के लिए कभी नहीं आया क्योंकि मैंने उस नियोक्ता को छोड़ दिया था। कुछ ऐसा है जिसे मैं हालांकि लागू करना पसंद करूंगा।
मार्सेलो मिओरेल्ली

जवाबों:


17

स्तर 2 के बारे में क्या? मुझे लेवल 2 से संबंधित कुछ भी नहीं मिला।

इस पुराने MS Doc के अनुसार Tempdb स्पिल में संख्या बताती है कि डेटा को सॉर्ट करने के लिए डेटा पर कितने पास की आवश्यकता होती है। तो Spill 1 का मतलब है कि डेटा को सॉर्ट करने के लिए 1 बार पास करना होगा और 2 का मतलब 2 बार पास करना होगा।

ब्लॉग से उद्धरण:

यदि एक सॉर्ट ऑपरेशन से संबंधित क्वेरी 2 के स्पिल स्तर मान के साथ एक सॉर्ट चेतावनी समूह बनाता है, तो क्वेरी का प्रदर्शन प्रभावित हो सकता है क्योंकि डेटा को सॉर्ट करने के लिए डेटा पर एकाधिक पास आवश्यक हैं। नीचे दिए गए उदाहरण में हम 1 का स्पिल स्तर मान देखते हैं, जिसका अर्थ है कि डेटा पर एक पास सॉर्ट को पूरा करने के लिए पर्याप्त था।

70 क्यों? मैं sql सर्वर 2014 का उपयोग कर रहा हूं

ऐसा इसलिए है क्योंकि चित्र में डेटाबेस का संगतता स्तर 120 नहीं है (जो कि 2014 डेटाबेस के संगतता स्तर को दर्शाता है) क्योंकि यह 120 क्वेरी पुराने कार्डिनैलिटी अनुमान (सीई) मॉडल का उपयोग करके संसाधित नहीं किया जाएगा, जिसे इसे संदर्भित किया जाता है CardinalityEstimationModelVersion="70"। मुझे यकीन है कि आप जानते हैं कि SQL Server 2014 से हमारे पास नया CE है।

मैं उस प्रकार के ऑपरेटर से कैसे छुटकारा पाऊंगा (यदि संभव हो तो)?

आपके द्वारा उपयोग किया जा रहा विशिष्ट आदेश सॉर्ट ऑपरेशन के कारण है। जिस डेटा को सॉर्ट किया जा रहा है, वह मेमोरी में फिट नहीं होता है, इसलिए इसे tempdb पर भेज दिया जाता है और जब ऐसा होता है तो निष्पादन योजना में पीले विस्मयबोधक चिह्न के साथ एक प्रकार की चेतावनी दी जाती है। क्रमबद्ध चेतावनी हमेशा एक समस्या नहीं होती है।

आप निष्पादन योजना में देख सकते हैं कि छंटनी की जाने वाली पंक्तियों की अनुमानित संख्या 1 है, लेकिन 16,353 रन टाइम पर सामने आई हैं। सॉर्ट के लिए आरक्षित मेमोरी की मात्रा इनपुट के अपेक्षित (अनुमानित) आकार पर आधारित है , और निष्पादन के दौरान (इस मामले में) नहीं बढ़ सकती है।

क्वेरी (1632KB) के लिए छोटे मेमोरी अनुदान को समवर्ती-निष्पादित मेमोरी-खपत ऑपरेटरों (सॉर्ट और 'अनुकूलित' लूप जॉन्स) के बीच साझा किया जाता है। आपकी योजना में, इसका मतलब है कि पंक्तियों को पढ़ने के दौरान 33.33% (544KB) उपलब्ध है (इनपुट मेमोरी अंश)। यह 16,353 पंक्तियों को सॉर्ट करने के लिए पर्याप्त स्मृति, तो यह करने के लिए फैल नहीं है tempdb । सॉर्ट को पूरा करने के लिए एक एकल स्तर का स्पिल पर्याप्त नहीं है, इसलिए स्पिलिंग के दूसरे स्तर की आवश्यकता है (स्पिल स्तरों पर अधिक विवरण के लिए अंत में संदर्भ देखें)।

गुणों को क्रमबद्ध करें

SQL संतरी प्लान एक्सप्लोरर में देखे गए गुणों को क्रमबद्ध करें

अद्यतन आँकड़ों की संभावना कार्डिनैलिटी आकलन के अंक में मदद करेगी। आप विशेष रूप से टेबल पर आरोही प्रमुख समस्या का सामना कर रहे हैं tblBOrder। आपके प्रश्न से शाब्दिक तारीखों के साथ उस तालिका का एक सरल चयन संभवतः एक पंक्ति का अनुमान लगाएगा।

मैंने इस सर्वर पर अधिक मेमोरी जोड़ने के अलावा, पेज लाइफ की उम्मीद को बहुत कम देखा है, क्या कोई अन्य चीज है जिसे मैं देख सकता हूं कि क्या मैं इस चेतावनी को रोक सकता हूं?

PLE I / O गतिविधि की मात्रा का संकेत है, क्या यह बढ़ा है? तो क्या यह अक्सर या केवल तब होता है जब आप कुछ क्वेरी चलाते हैं या यह आज ही हुआ है। घुटने के झटका प्रतिक्रिया से बचें, पहले हमें यह सुनिश्चित करने की आवश्यकता है कि आप वास्तव में मेमोरी दबाव या कुछ दुष्ट क्वेरी का सामना कर रहे हैं जो बहुत अधिक I / O उत्पन्न कर रहा है। वैसे भी आपके पास पहले से ही SQL सर्वर को सौंपी गई 97 G मेमोरी है।

फैल स्तर और आरोही प्रमुख समस्या के बारे में अधिक जानकारी के लिए, देखें:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.