2012-10-22 8 views
8

से बहुत धीमी है इसमें मेरे पास 100 एमएम रिकॉर्ड के साथ एक टेबल है। तालिका में क्लस्टर्ड इंडेक्स और एक नॉनक्लस्टर्ड इंडेक्स है।एसक्यूएल सर्वर संग्रहीत प्रक्रिया सीधे क्वेरी

मैं तालिका पर टी-एसक्यूएल का उपयोग करके मूल गणना चला सकता हूं और इसे चलाने के लिए 1 सेकंड लगते हैं। जब मैं एक संग्रहीत प्रक्रिया के अंदर एक ही सटीक गिनती क्वेरी डालता हूं तो इसे चलाने के लिए 12 सेकंड लगते हैं।

मैंने मानक क्वेरी और संग्रहीत प्रक्रिया दोनों के लिए निष्पादन योजना को देखा है और वे दोनों गैर-क्लस्टर इंडेक्स का उपयोग कर रहे हैं।

मुझे यकीन नहीं है कि संग्रहीत प्रक्रिया मानक क्वेरी की तुलना में इतनी धीमी क्यों है।

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

इस पर कोई मदद महान होगी।

धन्यवाद

अद्यतन

यहाँ संग्रहीत प्रक्रिया है:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE quickCount 

@sYID INT, 
@eYID INT 

AS 
BEGIN 

SET NOCOUNT ON; 


    SELECT COUNT(leadID) 
    FROM dbo.leads 
    WHERE yearID >= @sYID 
    AND yearID <= @eYID 

END 
GO 

और यहाँ मानक क्वेरी है:

SELECT COUNT(leadID) 
FROM leads 
WHERE yearID >= 0 
AND yearID <= 99 

मुझे कोई पैरामीटर से चलाने का प्रयास किया और एसपी तेजी से चलता है (1 सेकंड)। तो मुझे लगता है कि यह पैरामीटर के साथ कुछ करने के लिए है।

+1

आप हम में से सपा एक सा दिखा सकते हैं, डो ने आपको कोई पैरामीटर में पारित? –

+0

मुझे लगता है कि आपको अपनी क्वेरी और एसपी दिखाने की आवश्यकता होगी। –

+1

ऐसा हो सकता है कि आपने स्थिरांक के साथ क्वेरी की कोशिश की है और इस स्थिरांक के बजाय आपकी प्रक्रिया उपयोग पैरामीटर। मैं आपको SQLFiddle उदाहरण बनाने या स्कीमा और क्वेरी/sp –

उत्तर

16

चर में पारित की स्थानीय कॉपी का उपयोग करके अपने सपा बदलने का प्रयास करें। कारण पैरामीटर Snffing के लिए, एक सपा बहुत धीमी चला सकते हैं

तरह
ALTER PROCEDURE quickCount 

@sYID INT, 
@eYID INT 

AS 
BEGIN 

SET NOCOUNT ON; 
    DECLARE @Local_sYID INT, 
      @Local_eYID INT 
    SELECT @Local_sYID = @sYID INT, 
      @Local_eYID = @eYID INT 

    SELECT COUNT(leadID) 
    FROM dbo.leads 
    WHERE yearID >= @Local_sYID 
    AND yearID <= @Local_eYID 

END 

मुझे लगता है कि इससे पहले कि मिल गया है, लेकिन एक बार जब आप चर के प्रतियों का उपयोग करते हैं तो प्रदर्शन लौटाता है।

What is Parameter Sniffing ?

SQL Server : Parameter Sniffing

+0

मदद के लिए धन्यवाद लेकिन मैंने पहले ही कोशिश की थी। यह इसे तेजी से नहीं बना रहा है। – Sequenzia

+1

वाह! उसके लिए धन्यवाद! जब तक मुझे यह पोस्ट नहीं मिला, तब तक मुझे अपने एसपी में समस्या नहीं मिली! आपका बहुत बहुत धन्यवाद! – artsylar

+0

@Sequenzia धन्यवाद –

1

तुम हमेशा के रूप में गतिशील एसक्यूएल निष्पादित करने के लिए कोशिश कर सकते:

ALTER PROCEDURE quickCount 

@sYID INT, 
@eYID INT 

AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @SQL VARCHAR(max) 

    SELECT @SQL = ' 
    SELECT COUNT(leadID) 
    FROM dbo.leads 
    WHERE yearID >= '+CONVERT(VARCHAR(20),@sYID)+' 
    AND yearID <= '+CONVERT(VARCHAR(20),@eYID) 

    EXEC (@SQL) 
END 
0

पहली बार जब आप संग्रहीत प्रक्रिया चलाने के लिए, एसक्यूएल सर्वर होगा संग्रहीत प्रक्रिया संकलित करने के लिए , जो कुछ समय ले सकता है। @Astander ने पैरामीटर स्नीफिंग का उल्लेख किया - जो एक वैध बिंदु है, और आपके परिणामों को छोड़ सकता है।

कुछ अन्य कारकों पर विचार करने के लिए कर रहे हैं (जबकि वे वास्तव में अपने लक्षणों नहीं समझाना चाहिए):

  • आप, उदाहरण के लिए एक ताला स्तर के लिए मजबूर कर सकता है तालिका नाम के बाद WITH (NOLOCK), जो समस्या को हल कर सकता है (लेकिन ध्यान दें कि आप ऐसा करके गलत परिणाम प्राप्त कर सकते हैं)।
  • आप मेज पर आंकड़ों को अपडेट या अनुक्रमित
4

जैसा कि पहले ही उल्लेख किया Defragment करने की आवश्यकता हो सकती है, यह एक पैरामीटर समस्या सूँघने हो सकता है। लाइन सहित:

OPTION (RECOMPILE) 

आपकी SQL क्वेरी के अंत में प्रयास करें।

वहाँ एक लेख यहाँ समझा क्या पैरामीटर सूंघने है: http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx