SQL Server 2016 खराब क्वेरी योजना एक सप्ताह में एक बार DB को लॉक करती है


16

सप्ताह में एक बार, पिछले 5 हफ्तों के लिए, दिन के एक ही समय के आसपास (सुबह जल्दी, उपयोगकर्ता गतिविधि पर आधारित हो सकता है जब लोग इसका उपयोग करना शुरू कर रहे हैं), SQL Server 2016 (AWS RDS, मिरर किए गए) बहुत समय से बाहर शुरू होता है प्रश्नों।

सभी तालिकाओं पर अद्यतन सांख्यिकी हमेशा इसे तुरंत ठीक करता है।

पहली बार के बाद, मैंने इसे रात (साप्ताहिक के बजाय) सभी तालिकाओं पर सभी आँकड़े अपडेट किए, लेकिन यह अभी भी हुआ, (अपडेट आँकड़े चलने के लगभग 8 घंटे बाद, लेकिन हर दिन यह नहीं चलता है कि यह चलता है)।

पिछली बार, मैंने क्वेरी स्टोर को यह देखने के लिए सक्षम किया कि क्या मुझे पता चल सकता है कि यह कौन सी विशिष्ट क्वेरी / क्वेरी योजना थी। मुझे लगता है कि मैं इसे एक तक सीमित करने में सक्षम था:

खराब क्वेरी योजना

उस क्वेरी को खोजने के बाद, मैंने एक अनुशंसित इंडेक्स जोड़ा, जो इस बार-बार उपयोग किए जाने वाले क्वेरी से गायब था (लेकिन जो बहुत बार टेबल को छूता है)।

खराब क्वेरी योजना एक इंडेक्स स्कैन (केवल 10k पंक्तियों वाली तालिका पर) कर रही थी। अन्य क्वेरी योजनाएं जो मिलीसेकंड में वापस आ गईं, हालांकि वे एक ही स्कैन करते थे। नया इंडेक्स बनाने के बाद सबसे नया क्वेरी प्लान केवल खोजता है। लेकिन उस सूचकांक के बिना भी, 99% समय, यह कुछ मिलीसेकंड के भीतर लौट रहा था, लेकिन फिर, साप्ताहिक, इसे 40 सेकंड लगेंगे।

यह 2012 से SQL सर्वर 2016 में जाने के बाद शुरू हुआ।

DBCC CHECKDB कोई त्रुटि नहीं देता है।

  1. क्या नया सूचकांक समस्या को ठीक करेगा, जिससे यह फिर से खराब योजना का चयन नहीं करेगा?
  2. क्या मुझे उस योजना को "मजबूर" करना चाहिए जो अब अच्छी तरह से काम करती है?
  3. मैं यह कैसे सुनिश्चित करूं कि यह किसी अन्य प्रश्न / योजना के लिए नहीं है?
  4. क्या यह एक बड़ी समस्या का लक्षण है?

अनुक्रमणिका मैं अभी जोड़ा गया:

CREATE NONCLUSTERED INDEX idx_AppointmetnAttendee_AttendeeType
ON [dbo].[AppointmentAttendee] ([UserID],[AttendeeType])

CREATE NONCLUSTERED INDEX [idx_appointment_start] ON [dbo].[Appointment]
(
    [ProjectID] ASC,
    [Start] ASC
)
INCLUDE (   [ID],
    [AllDay],
    [End],
    [Location],
    [Notes],
    [Title],
    [CreatedByID]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

पूर्ण क्वेरी पाठ:

https://pastebin.com/Z5szPBfu (LINQ-generate, मैं चयनित कॉलमों को अनुकूलित करने में सक्षम हो सकता / सकती हूं, लेकिन यह इस समस्या के लिए अप्रासंगिक होना चाहिए)


मैंने अभी देखा कि पिछले योजनाओं पर स्कैन जो समय से बाहर नहीं था, एक ही आकार के चारों ओर एक अलग तालिका पर था। अपॉइंटमेंट: 11931 पंक्तियाँ, अपॉइंटमेंटअंटी: 11937 पंक्तियाँ।
प्रोफेशनल साउंडिंग नेम

जवाबों:


16

मैं आपके प्रश्नों का उत्तर एक अलग क्रम में देने जा रहा हूं, जितना आपने उनसे पूछा है।

4. क्या यह एक बड़ी समस्या का लक्षण है?

नई प्रमुखता आकलनकर्ता एसक्यूएल सर्वर 2016 में समस्या के लिए योगदान हो सकता है। SQL सर्वर 2012 विरासत CE का उपयोग करता है और आप उस संस्करण पर अपनी समस्या का अनुभव नहीं किया। नया कार्डिनैलिटी अनुमानक आपके डेटा के बारे में अलग-अलग धारणाएँ बनाता है और एक ही एसक्यूएल के लिए अलग-अलग क्वेरी प्लान तैयार कर सकता है। आप अपनी क्वेरी और अपने डेटा के आधार पर विरासत सीई के साथ कुछ प्रश्नों के लिए बेहतर प्रदर्शन का अनुभव कर सकते हैं। तो, आपके डेटा मॉडल के कुछ हिस्से नए सीई के लिए सबसे अच्छा मैच नहीं हो सकते हैं। यह ठीक है, लेकिन आपको अभी के लिए नए सीई के आसपास काम करने की आवश्यकता हो सकती है।

मैं भी दैनिक आँकड़े अद्यतन के साथ असंगत क्वेरी प्रदर्शन के साथ संबंध होगा। ध्यान देने वाली एक महत्वपूर्ण बात यह है कि सभी तालिकाओं पर आंकड़े एकत्रित करने से कैश से सभी क्वेरी योजनाओं को प्रभावी ढंग से मिटा दिया जाएगा, इसलिए आपके पास आंकड़ों के साथ एक समस्या हो सकती है या इसे पैरामीटर सूँघने के साथ हो सकता है। अपने डेटा मॉडल, डेटा परिवर्तन दर, नीतियों को अपडेट करने की नीतियों, आप अपना कोड कैसे कॉल कर रहे हैं, आदि के बारे में बहुत अधिक जानकारी के बिना दृढ़ संकल्प करना मुश्किल है। SQL Server 2016 पैरामीटर सूँघने के लिए कुछ डेटाबेस स्तर सेटिंग्स प्रदान करता है जो सहायक हो सकता है। , लेकिन यह सिर्फ एक समस्याग्रस्त क्वेरी के बजाय आपके पूरे आवेदन को प्रभावित कर सकता है।

मैं एक उदाहरण परिदृश्य को बाहर फेंक दूँगा जो इस व्यवहार को जन्म दे सकता है। तुमने कहा था:

कुछ उपयोगकर्ता 1 अनुमति रिकॉर्ड कर सकते हैं, कुछ, 20k तक।

मान लीजिए कि आप सभी तालिकाओं पर आँकड़े एकत्र करते हैं जो सभी क्वेरी योजनाओं को मिटा देते हैं। ऊपर वर्णित कारकों के आधार पर, यदि दिन की पहली क्वेरी केवल 1 अनुमति रिकॉर्ड वाले उपयोगकर्ता के खिलाफ है, तो SQL सर्वर एक योजना को कैश कर सकता है जो 1 रिकॉर्ड वाले उपयोगकर्ताओं के लिए अच्छी तरह से काम करता है, लेकिन 20k रिकॉर्ड वाले उपयोगकर्ताओं के साथ बहुत अच्छा काम करता है। यदि दिन की पहली क्वेरी 20k रिकॉर्ड वाले उपयोगकर्ता के खिलाफ है तो आपको 20k रिकॉर्ड के लिए एक अच्छी योजना मिल सकती है। जब कोड 1 रिकॉर्ड वाले उपयोगकर्ता के खिलाफ चलाया जाता है तो यह सबसे इष्टतम क्वेरी नहीं हो सकता है लेकिन यह अभी भी एमएस में समाप्त हो सकता है। यह वास्तव में पैरामीटर सूँघने जैसी आवाज़ करता है। यह बताता है कि आप हमेशा इस मुद्दे को क्यों नहीं देखते हैं या कभी-कभी इसे दिखाने में घंटों क्यों लगते हैं।

1. क्या नया सूचकांक समस्या को ठीक करेगा, जिससे यह खराब योजना को फिर से नहीं चुन सकेगा?

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

खराब योजना

SQL सर्वर का अनुमान है कि केवल एक पंक्ति में शामिल होने से [Permission]और वापस आ जाएगी [Project]। बाहरी इनपुट में प्रत्येक पंक्ति के लिए यह एक क्लस्टर इंडेक्स स्कैन करेगा [Appointment]। इस तालिका से सभी पंक्तियों को स्कैन किया जाएगा, लेकिन केवल फ़िल्टर [Start]करने वाले मिलानकर्ता को ऑपरेटर से वापस कर दिया जाएगा। ज्वाइन ऑपरेटर के भीतर परिणाम और कम हो जाते हैं।

ऊपर वर्णित क्वेरी योजना ठीक हो सकती है अगर वास्तव में सिर्फ एक पंक्ति में शामिल होने के बाहरी इनपुट के लिए भेजा जाता है। हालाँकि, यदि जुड़ने से कार्डिनिटी का अनुमान गलत है और हम कहते हैं, 1000 पंक्तियाँ, तो SQL सर्वर 1000 क्लस्टर इंडेक्स स्कैन करेगा [Appointment]। क्वेरी योजना का प्रदर्शन आकलन मुद्दों के प्रति बहुत संवेदनशील है।

उस क्वेरी प्लान को दोबारा प्राप्त करने का सबसे सीधा तरीका यह होगा कि [Appointment]टेबल के खिलाफ एक कवरिंग इंडेक्स बनाया जाए । एक सूचकांक की तरह कुछ [ProjectId]और [Start]यह करना चाहिए। ऐसा लगता है कि यह वास्तव में [idx_appointment_start]सूचकांक है जिसे आपने समस्या को संबोधित करने के लिए बनाया है। क्वेरी प्लान लेने से SQL सर्वर को हतोत्साहित करने का एक और तरीका है कि कार्डिनैलिटी के अनुमान को ज्वाइन से ठीक किया जाए [Permission]और [Project]। ऐसा करने के विशिष्ट तरीके, जिसमें कोड बदलना, आँकड़े अद्यतन करना, विरासत CE का उपयोग करना, बहु-स्तंभ आँकड़े बनाना, SQL सर्वर को स्थानीय चर जैसे RECOMPILEसंकेत के बारे में अधिक जानकारी देना या उन पंक्तियों को एक अस्थायी तालिका में शामिल करना शामिल है। उन तकनीकों में से कई एक अच्छा तरीका नहीं है जब आपको एमएस स्तर प्रतिक्रिया समय की आवश्यकता होती है या एक ओआरएम के माध्यम से कोड लिखना पड़ता है।

आपके द्वारा बनाया गया सूचकांक [AppointmentAttendee]समस्या का समाधान करने का एक सीधा तरीका नहीं है। हालाँकि, आपको सूचकांक पर बहु-स्तंभ आँकड़े मिलेंगे और वे आँकड़े खराब क्वेरी योजना को हतोत्साहित कर सकते हैं। सूचकांक डेटा को एक्सेस करने के लिए अधिक कुशल तरीका प्रदान कर सकता है जो खराब क्वेरी योजना को भी हतोत्साहित कर सकता है, लेकिन मुझे नहीं लगता कि किसी भी तरह की गारंटी है कि यह सिर्फ सूचकांक पर फिर से नहीं होगा [AppointmentAttendee]

3. मैं यह कैसे सुनिश्चित करूं कि यह किसी अन्य प्रश्न / योजना के लिए नहीं है?

मैं समझता हूं कि आप यह सवाल क्यों पूछ रहे हैं, लेकिन यह एक बहुत व्यापक है। मेरी एकमात्र सलाह क्वेरी प्लान अस्थिरता के मूल कारण को बेहतर ढंग से समझने की कोशिश करना है, ताकि आप अपने कार्यभार के लिए सही सूचकांक बना सकें, और अपने कार्यभार का सावधानीपूर्वक परीक्षण और निगरानी कर सकें। Microsoft ने कुछ सामान्य सलाह दी है कि SQL Server 2016 में नए CE द्वारा किए गए क्वेरी प्लान रिग्रेशन से कैसे निपटें:

क्वेरी प्रोसेसर को कोड के नवीनतम संस्करण में अपग्रेड करने के लिए अनुशंसित वर्कफ़्लो है:

  1. डेटाबेस संगतता स्तर को बदले बिना SQL सर्वर 2016 के लिए डेटाबेस को अपग्रेड करें (इसे पूर्व स्तर पर रखें)

  2. डेटाबेस पर क्वेरी स्टोर को सक्षम करें। क्वेरी स्टोर को सक्षम करने और उपयोग करने के बारे में अधिक जानकारी के लिए, क्वेरी स्टोर का उपयोग करके मॉनिटरिंग प्रदर्शन देखें।

  3. कार्यभार के प्रतिनिधि डेटा एकत्र करने के लिए पर्याप्त समय प्रतीक्षा करें।

  4. डेटाबेस के संगतता स्तर को 130 में बदलें

  5. SQL सर्वर प्रबंधन स्टूडियो का उपयोग करना, मूल्यांकन करें कि संगतता स्तर परिवर्तन के बाद विशिष्ट प्रश्नों पर प्रदर्शन प्रतिगमन है या नहीं

  6. ऐसे मामलों के लिए जहां प्रतिगमन हैं, क्वेरी स्टोर में पूर्व योजना को बाध्य करें।

  7. यदि ऐसी क्वेरी योजनाएँ हैं जो जबरदस्ती करने में विफल रहती हैं या यदि प्रदर्शन अभी भी अपर्याप्त है, तो संगतता सेटिंग को पूर्व सेटिंग और फिर Microsoft ग्राहक समर्थन को उलझाने पर विचार करें।

मैं यह नहीं कह रहा हूं कि आपको SQL Server 2012 को डाउनग्रेड करने और शुरू करने की आवश्यकता है, लेकिन वर्णित सामान्य तकनीक आपके लिए उपयोगी हो सकती है।

2. क्या मुझे उस योजना को "मजबूर" करना चाहिए जो अब अच्छी तरह से काम करती है?

यह पूरी तरह से आप पर निर्भर है। यदि आप मानते हैं कि आपके पास एक क्वेरी योजना है जो सभी संभावित इनपुट मापदंडों के लिए अच्छी तरह से काम करती है, तो क्वेरी स्टोर की कार्यक्षमता के साथ सहज हैं, और मन की शांति चाहते हैं जो एक क्वेरी योजना को मजबूर करने के साथ आती है तो इसके लिए जाएं। ज़बरदस्त क्वेरी योजनाएँ जिनमें regressions थी, Microsoft की सभी के बाद SQL Server 2016 में अपग्रेड नीति की सिफारिश करने का एक हिस्सा है।

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