SQL सर्वर क्वेरी धीमी जब paginated


15

मैं SQL सर्वर 2012 में निम्नलिखित T-SQL क्वेरी के साथ कुछ अजीब व्यवहार देख रहा हूं:

SELECT Id 
FROM dbo.Person 
WHERE CONTAINS(Name, '"John" AND "Smith"')
ORDER BY Name

अकेले इस क्वेरी को निष्पादित करने से मुझे दो सेकंड से भी कम समय में लगभग 1,300 परिणाम मिलते हैं (इसमें एक पूर्णांक अनुक्रमणिका है Name)

हालाँकि, जब मैं इस से प्रश्न बदलता हूँ:

SELECT Id 
FROM dbo.Person 
WHERE CONTAINS(Name, '"John" AND "Smith"')
ORDER BY Name
OFFSET 0 rows
FETCH NEXT 10 ROWS ONLY

मुझे 10 परिणाम देने में 20 सेकंड से अधिक समय लगता है।

निम्नलिखित क्वेरी और भी बदतर है:

SELECT Id 
FROM ( 
    SELECT ROW_NUMBER() OVER (ORDER BY Name) AS RowNum, Id 
    FROM dbo.Person
    WHERE CONTAINS(Name, '"John" AND "Smith"') ) AS RowConstrainedResult 
WHERE RowNum >= 0 AND RowNum < 11 
ORDER BY RowNum

इसे पूरा करने में 1.5 मिनट से अधिक समय लगता है!

कोई विचार?

धीमी योजना

धीरे

तेज योजना

तेज


यदि आप अपनी दूसरी क्वेरी को बदलते हैं तो क्या होता है SELECT TOP 10 * .... ORDER BY Name?
लामक

IX_PersonSearch ... किस स्तंभ पर बनाया गया है? आपको एक महत्वपूर्ण खोज मिल रही है क्योंकि आप तालिका से * का चयन कर रहे हैं और उपयोग किए गए सूचकांक में सभी आउटपुट कॉलम नहीं हैं। मुझे लगता है कि आपको केवल उन कॉलमों का चयन करना चाहिए जिनकी आपको आवश्यकता है और फिर उन्हें गैर-क्लस्टर इंडेक्स में शामिल करें जैसे कि कॉलम शामिल हैं, न कि इंडेक्स कॉलम।
मार्सेल एन।

क्या आप टेबल पर इंडेक्स बना सकते हैं (स्क्रिप्ट बना सकते हैं)?

3
आईडी को हमेशा हर गैर-सूचीबद्ध सूचकांक में शामिल किया जाता है। यह वह तरीका है जो SQL सर्वर कुंजी लुकअप (आईडी द्वारा) करने में सक्षम है।
usr

1
मैं क्या उल्लेख करना भूल गया: जब मैं CONTAINS के बजाय LIKE के साथ एक ही क्वेरी करता हूं, तो तेज है, भी। (पृष्ठांकित या नहीं)

जवाबों:


7

जैसा कि आप सिर्फ TOP 10नाम से आदेश चाहते हैं, यह सोचता है कि यह nameक्रम में सूचकांक पर काम करने के लिए तेज होगा और यह देखना होगा कि क्या प्रत्येक पंक्ति CONTAINS(Name, '"John" AND "Smith"') )विधेय से मेल खाती है।

संभवत: 10 मैचों को खोजने के लिए कई और पंक्तियों की आवश्यकता होती है, फिर यह उम्मीद करता है और इस कार्डिनैलिटी समस्या को मुख्य लुकअप की संख्या से कंपाउंड किया जाता है।

इस योजना का उपयोग कर इसे रोकने के लिए एक त्वरित हैक को बदलना होगा ORDER BY, ORDER BY Name + ''हालांकि इसके CONTAINSTABLEसाथ संयोजन के रूप में उपयोग FORCE ORDERकरना भी काम करना चाहिए।


3

यह क्लासिक चयनात्मकता मिसस्टिमेशन जैसा दिखता है। निश्चित नहीं है कि इसके बारे में क्या किया जा सकता है क्योंकि क्वेरी का "ड्राइवर" पूर्ण खोज है जिसे आप आंकड़ों के साथ नहीं बढ़ा सकते।

where containsएक inner join containstable( CONTAINSTABLE ) के लिए विधेय को फिर से लिखने का प्रयास करें और योजना के आकार को लागू करने के लिए आदेश संकेत में शामिल हों।

यह एक सही समाधान नहीं है क्योंकि इसमें रखरखाव के मुद्दे हैं, लेकिन मैं दूसरा रास्ता नहीं देख सकता।


आपके उत्तर के लिए धन्यवाद, मैंने कोशिश की। हालांकि समान परिणाम: जब पृष्ठांकन का उपयोग नहीं कर रहा है, तो क्वेरी वास्तव में तेज़ है। जब Paginating यह अचानक फिर से धीमा हो जाता है: /

ठीक है आप एक छवि और अपनी क्वेरी के रूप में योजना पोस्ट कर सकते हैं? मेरा अनुमान है कि हम अभी तक वांछित आकार उत्पन्न करने में सफल नहीं हुए।
usr

3

मैं इस समस्या को हल करने में कामयाब रहा:

जैसा कि मैंने कहा था कि प्रश्न में प्रत्येक कॉलम के सभी कॉलम + आँकड़े पर संकेत दिए गए थे। (लीगेसी प्रश्नों की वजह से) मैंने सभी सूचियों और आँकड़ों को हटा दिया, फुलटेक्स्ट सर्च और वॉयलिया जोड़ा, क्वेरी वास्तव में बहुत तेज़ है।

ऐसा लगता है कि एक अलग निष्पादन योजना के लिए प्रेरित होता है।

आपकी मदद के लिए बहुत बहुत धन्यवाद!


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