"कभी-कभी" धीमी क्वेरी का निदान करने की सलाह


20

मेरे पास एक संग्रहीत कार्यविधि है जो एक अनुक्रमणिका के माध्यम से अनुक्रमित दृश्य से परिणाम देता है। आमतौर पर, यह तेजी से चलता है (~ 10ms), कभी-कभी यह 8 सेकंड तक चल सकता है।

यहां एक उदाहरण यादृच्छिक निष्पादन है (ध्यान दें: यह एक धीमा नहीं है, लेकिन क्वेरी पाठ समान मूल्य से अलग है):

declare @p2 dbo.IdentityType
insert into @p2 values(5710955)
insert into @p2 values(5710896)
insert into @p2 values(5710678)
insert into @p2 values(5710871)
insert into @p2 values(5711103)
insert into @p2 values(6215197)
insert into @p2 values(5710780)

exec ListingSearch_ByLocationAndStatus @statusType=1,@locationIds=@p2

यहाँ SPROC है:

ALTER PROCEDURE [dbo].[ListingSearch_ByLocationAndStatus]
    @LocationIds IdentityType READONLY,
    @StatusType TINYINT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT      -- lots of fields
    FROM        [dbo].[ListingSearchView][a] WITH (NOEXPAND)
    INNER JOIN  @LocationIds [b] ON [a].[LocationId] = [b].[Id]
    WHERE       [a].[StatusType] = @statusType
    OPTION (RECOMPILE);

(नोट: मैंने OPTION (RECOMPILE)कुछ सलाह के बाद हाल ही में संकेत जोड़ा है , लेकिन यह मदद नहीं की है।

यहां कवरिंग इंडेक्स (ध्यान दें: दृश्य में एक क्लस्टर इंडेक्स भी है ListingId, जो अद्वितीय है)

CREATE NONCLUSTERED INDEX [IX_ListingSearchView_ForAPI] ON [dbo].[ListingSearchView]
(
    [LocationId] ASC,
    [StatusType] ASC
)
INCLUDE ( -- all the fields in the query) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO

मैंने शोपलेन एक्सएमएल आँकड़ों के साथ एक प्रोफाइलर का पता लगाया।

यहां एक धीमी गति (6 सेकंड), और प्रासंगिक योजना है: यहां छवि विवरण दर्ज करें

जैसा मैं उम्मीद करता हूं, वैसा ही दिखता है, और क्वेरी तेज होने पर भी यही योजना है।

यहाँ योजना के महँगे हिस्से पर ज़ूम इन करें, अगर इससे मदद मिलती है: यहां छवि विवरण दर्ज करें

यहाँ दृश्य / समर्थन तालिका का पूर्ण स्कीमा है, यदि यह मदद करता है: https://pastebin.com/wh1sRcbQ

टिप्पणियाँ:

  • इंडेक्स को डीफ़्रैग्ड किया जाएगा, आज तक के आंकड़े।
  • मूल रूप से क्वेरी दृश्य के विरुद्ध इनलाइन थी, लेकिन मैंने कोशिश करने और स्थिर करने में मदद करने के लिए SPROC में स्थानांतरित किया। मदद नहीं की है।
  • WITH OPTION (RECOMPILE);संकेत जोड़ना (काम नहीं किया, इसलिए पैरामीटर सूँघना नहीं हो सकता?)
  • सिस्टम में अन्य प्रश्न भी कभी-कभी धीमी गति से चलते हैं, और उनकी योजना में भी कोई स्पष्ट मुद्दे नहीं होते हैं।
  • ताला लगा सकता है? यकीन नहीं है कि कैसे पुष्टि करें।

मैं आगे क्या कोशिश कर सकता है पर कोई विचार?

धन्यवाद


1
टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है । सभी: कृपया इस प्रश्न के आगे की चर्चा के लिए उस सुविधा का उपयोग करें।
पॉल व्हाइट GoFundMonica कहते

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

जब क्वेरी चल रही है तो क्या आपने WhoIsActive (एडम मचानिक द्वारा) चलाने की कोशिश की है? whoisactive.com इसमें प्रतीक्षा कार्यों की जानकारी शामिल है, जो आपको सही दिशा में इंगित करना चाहिए।
एमजेएच

क्या आपने डीबी के कारण कुछ बाहरी को खत्म कर दिया है। संभवत: कुछ अन्य एप्लिकेशन, जो DB के साथ साझा किए गए भंडारण के लिए तुल्यकालिक IO का कारण बन रहे हैं?
जोहान

जवाबों:


2

मैं वास्तव में इसका उपयोग करने के बारे में नहीं सोचता OPTION (RECOMPILE) पैरामीटर सूँघने की संभावना को खत्म करने के लिए एक प्रभावी तरीका है।

पैरामीटर सूँघने तब होता है जब SQL एक विशेष क्वेरी के बारे में उलझन में है और अपने नए सोचता है क्योंकि यह नए मापदंडों को देखता है। यह धीमा है क्योंकि नई निष्पादन योजना तैयार करने में अतिरिक्त समय लग रहा है।

वह सभी विकल्प SQL को हर बार एक नई योजना तैयार करने के लिए मजबूर करता है जो कि बहुत ही समान है। इसके बजाय, आप इस संकेत का उपयोग करके डिफ़ॉल्ट मापदंडों को जोड़ने पर विचार कर सकते हैं:

OPTION(OPTIMIZE FOR(@LocationIds='xx',@StatusType='xx'))

डिफ़ॉल्ट के लिए मापदंडों का चयन करते समय सांख्यिकीय प्रतिनिधि सेट का उपयोग करना सुनिश्चित करें।
वह हर बार उसी योजना का उपयोग करने के लिए मजबूर करेगा और पैरामीटर सूँघने की संभावना को समाप्त कर देगा। एक बार जब आप ऐसा करते हैं, और यह निर्धारित करते हैं कि यह मदद नहीं करता है, तो इसकी संभवतः संभावना के रूप में सूँघने वाले पैरामीटर को खारिज करने के लिए सुरक्षित है।


1

शायद आदेश को लागू करने की कोशिश करें, इसलिए आप हमेशा छोटी तालिका (चर) के साथ शुरू कर रहे हैं। हालांकि विचारों के साथ यह मुश्किल है ...

    SELECT  -- lots of fields
    FROM    @LocationIds [b] WITH (NOEXPAND)
            INNER JOIN  [dbo].[ListingSearchView][a] WITH (NOEXPAND) 
                ON [a].[LocationId] = [b].[Id]
    WHERE   [a].[StatusType] = @statusType
    OPTION (FORCE ORDER);

या आप एक लूप जॉइन को बाध्य कर सकते हैं यदि वह आम तौर पर आप तालिका चर को व्यू में शामिल करना चाहते हैं, जो ऑर्डर को भी मजबूर करेगा ...

    SELECT  -- lots of fields
    FROM    @LocationIds [b] WITH (NOEXPAND)
            INNER LOOP JOIN  [dbo].[ListingSearchView][a] WITH (NOEXPAND) 
                ON [a].[LocationId] = [b].[Id]
    WHERE   [a].[StatusType] = @statusType
    --leaving this here so you don't get an annoying warning 
    OPTION (FORCE ORDER);

0

क्वेरी संपादक में स्टोर प्रक्रिया का नाम लिखें, फिर स्टोर की खरीद का चयन करें। नाम और फिर प्रदर्शन अनुमानित निष्पादन योजना का चयन करें या क्लिक करें (Ctrl + L)। इस की छवि के नीचे।

प्रदर्शन की छवि अनुमानित निष्पादन योजना

तब एक्ज़ेक्यूशन प्लान क्वैरी एडिटर के निचले हिस्से में मैसेज टैब के बगल में दिखता है। फिर हरे रंग की रेखाओं में गायब अनुक्रमणिका विवरण दिखाते हैं और उस पर राइट क्लिक करते हैं। फिर नए टैब में नई क्वेरी खुली तो INDEX बनाएं। फिर आपका क्वेरी तेजी से चलता है।

इसलिए मैंने इस पद्धति का उपयोग निदान के लिए किया जो धीमी गति से काम करती है। और भी कई क्वेरी या विधि है जो आप उपयोग कर सकते हैं।

विवरण के साथ निष्पादन योजना


-1

यदि आपको लगता है कि समस्या अवरुद्ध है, तो मैं आपको आशावादी लेन-देन अलगाव स्तर का उपयोग करने का सुझाव दूंगा कमिटेड स्नैपशॉट पढ़ें (ध्यान रखें कि यह आपके tempDB पर ओवरहेड डाल देगा)।

संदर्भ: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server

यह समस्या रीड / राइटिंग ब्लॉकिंग में नहीं है, आप अपने दृश्य पर इंडेक्स जोड़ने का प्रयास कर सकते हैं (इंडेक्स का सबसे अच्छा विकल्प आपके डेटा की चयनात्मकता पर निर्भर करता है)

CREATE NONCLUSTERED INDEX IX_ListingSearchView (LocationID, StatusType) INCLUDE (other columns...)

1
आपके द्वारा सुझाया गया सूचकांक पहले से मौजूद है IX_ListingSearchView_ForAPI(प्रश्न में स्क्रिप्ट देखें)।
पॉल व्हाइट GoFundMonica कहते

1
अरे, आपके उत्तर के लिए धन्यवाद। जैसा कि मैंने अपने प्रश्न में कहा है, मैं जानना चाहता हूं कि समस्या को हल करने से पहले मुझे क्या करना चाहिए । अन्यथा मैं सिर्फ वास्तविक समस्या की अनदेखी कर सकता था। मेरा सवाल पहले समस्या का पता लगाने का है, फिर सही समाधान का।
RPM1984

क्या आप अपने स्थानीय वातावरण में उस धीमी क्वेरी को प्राप्त कर सकते हैं? यदि एक ही क्वेरी कभी-कभी धीमी गति से चलती है और कभी-कभी तेज चलती है तो यह इनपुट मापदंडों पर निर्भर हो सकता है। क्या आप कृपया तार्किक रीड्स की संख्या और आपकी धीमी क्वेरी द्वारा लौटी पंक्तियों की कुल संख्या प्रदान कर सकते हैं।
आर्टचैट्स खाचरटियन

@ArtashesKhachatryan हाँ, यह कभी-कभी स्थानीय पर भी धीमी गति से चलता है। मैंने एक निष्पादन योजना के साथ प्रश्न को अद्यतन किया है। मैं सोच रहा था कि क्या यह धीमी क्वेरी से संबंधित है जो एक से अधिक पंक्तियों को वापस कर रहा है, जैसा कि आपने कहा है।
RPM1984
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.