2011-10-24 6 views
5

में ठीक काम करता है मैं SQL Server 2008R2 का उपयोग कर ADO.NET से एक क्वेरी चलाने की कोशिश कर रहा हूं। मैं पेजिंग प्रदान करने और @Offset और @Limit के लिए पैरामीटर जोड़ने के लिए एक सीटीई का उपयोग कर रहा हूं, जो दोनों पूर्णांक हैं।ADO.NET टाइमआउट लेकिन एसएसएमएस

मैं उपयोगकर्ता इनपुट के आधार पर एक पैरामीटरयुक्त क्वेरी का निर्माण कर रहा हूं।

;WITH Results_CTE AS (
    SELECT ld.* , ROW_NUMBER() OVER (ORDER BY Key_Field) AS RowNum 
    FROM list..List_Data ld 
    WHERE VALUE_2010 IS NOT NULL 
    AND Postcode LIKE @Postcode + '%' 
) SELECT * FROM Results_CTE 
    WHERE RowNum > @Offset AND RowNum < @Offset + @Limit 
OPTION (RECOMPILE) 

खंड की तरह मैं कुछ का उपयोग कर रहा जिसके कारण मैं OPTION RECOMPILE है: अंतिम आउटपुट यह है। अगर मैं SSMS के माध्यम से मानकों की घोषणा और इतने की तरह चलाएँ:

declare @postcode varchar(10) = 'SW1 1AA'; 
declare @Offset int = 0; 
declare @Limit int = 10; 

मैं एक बहुत ही त्वरित प्रतिक्रिया समय (1s से भी कम) मिलता है। अगर मैं इसे ADO.NET के साथ आज़माता हूं, हालांकि, यह हमेशा के लिए लेता है। मैं इन दोनों के साथ पैरामीटर जोड़कर की कोशिश की है:

cmd.Parameters.AddWithValue("@Offset", startRowIndex) // times out 
cmd.Parameters.AddWithValue("@Limit", limit) 

cmd.Parameters.Add(New SqlParameter("@Offset", SqlDbType.BigInt)) // also times out 
cmd.Parameters.Item("@Offset").Value = startRowIndex 
cmd.Parameters.Add(New SqlParameter("@Limit", SqlDbType.BigInt)) 
cmd.Parameters.Item("@Limit").Value = limit 

अगर वहाँ केवल हालांकि पहले क्वेरी द्वारा रिटर्न कुछ ऐसी पंक्तियां हैं और मैं @Offset और @Limit छानने ड्रॉप, मैं एक सभ्य प्रतिक्रिया समय मिलता है। क्या कोई तरीका है कि मैं और पेजिंग का उपयोग कर सकता हूं?

संपादित करें: मैं @postcode पैरामीटर में गुजर रहा हूँ (जो .NET में एक स्ट्रिंग इस के माध्यम से है:

cmd.Parameters.AddWithValue("@Postcode", normalizedPostcode) 
+0

@close मतदाता। यह एक डुप्ली नहीं है। पिछला सवाल वैरिएबल के साथ अलग-अलग व्यवहार को समझाने के बारे में था पैरामीटर नहीं। दोनों को SQL सर्वर द्वारा अलग तरीके से इलाज किया जाता है। –

+0

क्या आप वह कोड दिखा सकते हैं जहां आप '@ पोस्टकोड' पैरामीटर में पास करते हैं? –

+0

क्या यह निश्चित रूप से एसक्यूएल टाइम आउट है? इस बात की कोई संभावना नहीं है कि कनेक्शन प्राप्त करने का प्रयास करने का समय (उदाहरण के लिए, जब आप ऐसा करते हैं तो आपके पास कनेक्शन के लोड अभी भी खुले हैं) या ऐसा कुछ और? – Chris

उत्तर

7

आपका ADO.NET कोड एक से a different datatype के पैरामीटर में गुजर रहा है जब आप परीक्षण कर रहे हैं SSMS में और आप अंतर्निहित डाली मुद्दों हो रही है।

इस वसीयत ऑटो के रूप में

cmd.Parameters.AddWithValue("@postcode", normalizedPostcode) 

का उपयोग न करें एकबनानेपैरामीटर और आपको अपनी निष्पादन योजना में अंतर्निहित कास्ट मिल जाएगा जिसका अर्थ है कि एक सूचकांक का उपयोग नहीं किया जा सकता है। इसके बजाय varchar के बजाय स्पष्ट रूप से बनाए गए पैरामीटर में पास करें।

cmd.Parameters.Add("@postcode", SqlDbType.Varchar, 10) 
+0

उत्कृष्ट टिप। डीईटी टाइप में .NET में पैरामीटर को ठीक से ट्यून करना कम या ज्यादा तत्काल प्रतिक्रिया प्राप्त करता है। – Echilon

2

1) @ पोस्टस्टोड पैरामीटर please specify the length के लिए।

cmd.Parameters.Add("@postcode", SqlDbType.VarChar, 10).Value = str

2) पुनर्लेखन क्वेरी:

;WITH Results_CTE AS (
    SELECT ld.Key_Field, ROW_NUMBER() OVER (ORDER BY Key_Field) AS RowNum 
    FROM list..List_Data ld 
    WHERE VALUE_2010 IS NOT NULL 
    AND Postcode LIKE @Postcode + '%' 
) SELECT * FROM Results_CTE a 
INNER JOIN list..List_Data b ON a.Key_Field = Key_Field 
WHERE RowNum > @Offset AND RowNum < @Offset + @Limit 
--OPTION (RECOMPILE) 

नोट 1: मुझे लगता है कि Key_Field प्राथमिक कुंजी (क्लस्टर) List_Data तालिका के लिए है।

नोट 2: जांचें कि क्या आपके पास VALUE_2010 और पोस्टकोड फ़ील्ड पर कोई अनुक्रमणिका है या नहीं। यदि आपके पास SQL ​​2008+ है तो आप फ़िल्टर किए गए इंडेक्स बना सकते हैं:

--UNIQUE if Postcode has unique values for VALUE_2010 IS NOT NULL 
CREATE [UNIQUE] INDEX aaa 
ON MySchema.List_Data (Postcode) 
WHERE VALUE_2010 IS NOT NULL 
+0

यह कुछ मिलीसेकंड द्वारा गति में सुधार करने लगता है, लेकिन यह भिन्न होता है। अच्छे उपाय के लिए चोट नहीं पहुंचा सकते हैं। – Echilon