2008-10-04 4 views
5

संपादित करें:मैं अभी भी अधिक उत्तरों के लिए इंतजार कर रहा हूं। धन्यवाद!एसक्यूएल सर्वर 2005 में बहुत बड़े परिणाम सेट के माध्यम से पेजिंग का एक प्रभावी तरीका क्या है?

एसक्यूएल 2000 दिनों, मैं अस्थायी तालिका पद्धति जहां आप नई पहचान स्तंभ और प्राथमिक कुंजी के साथ एक अस्थायी तालिका बनाने का उपयोग करते थे फिर चुनें जहां ए और बी

के बीच पहचान स्तंभ

जब एसक्यूएल 2005 आया साथ ही मुझे Row_Number() पता चला है और मैं इसका उपयोग तब से कर रहा हूं ...

लेकिन अब, मुझे Row_Number() के साथ एक गंभीर प्रदर्शन समस्या मिली है। यह बहुत अच्छा प्रदर्शन करता है जब आप न तो विशाल परिणाम सेट के साथ काम कर रहे हैं और पहचान कॉलम पर सॉर्ट कर रहे हैं। हालांकि, यह पर बहुत खराब प्रदर्शन करता है जब आप के साथ काम कर रहे हैं बड़े परिणाम 10,000 से अधिक रिकॉर्ड और गैर-पहचान कॉलम पर सॉर्ट करते हैं। Row_Number() यदि आप सेट सेट 250,000 से अधिक रिकॉर्ड हैं तो पहचान कॉलम द्वारा सॉर्ट करते हुए भी खराब प्रदर्शन करते हैं। मेरे लिए, यह एक बिंदु है जहां यह एक त्रुटि, "आदेश टाइमआउट!"

क्या आप एक बड़े एसक्यूएल 2005 को सेट परिणाम पृष्ठ पर अंक लगाना करने के लिए प्रयोग करते हैं फेंकता के लिए आया था? क्या इस मामले में temp table method अभी भी बेहतर है? मुझे यकीन नहीं है कि यह विधि using temp table with SET ROWCOUNT बेहतर प्रदर्शन करेगी ... लेकिन कुछ कहते हैं कि यदि आपके पास बहु-कॉलम प्राथमिक कुंजी है तो गलत पंक्ति संख्या देने का कोई मुद्दा है।

मेरे मामले में, मुझे अपने उत्पादन वेब ऐप के लिए दिनांक प्रकार कॉलम द्वारा परिणाम सेट को सॉर्ट करने में सक्षम होना चाहिए।

मुझे बताएं कि आप SQL 2005 में उच्च प्रदर्शन करने वाले पेजिनेशन के लिए क्या उपयोग करते हैं। और मैं इंडेक्स बनाने का एक स्मार्ट तरीका भी जानना चाहता हूं। मुझे सही प्राथमिक कुंजी और/या इंडेक्स (क्लस्टर्ड/गैर क्लस्टर) चुनने पर संदेह है, यहां एक बड़ी भूमिका निभाएगी।

अग्रिम धन्यवाद।

पीएस क्या किसी को पता है कि स्टैक ओवरफ्लो किस प्रकार उपयोग करता है?

संपादित करें: मेरा कुछ की तरह लग रहा ...

SELECT postID, postTitle, postDate 
FROM 
    (SELECT postID, postTitle, postDate, 
     ROW_NUMBER() OVER(ORDER BY postDate DESC, postID DESC) as RowNum 
    FROM MyTable 
    ) as DerivedMyTable 
WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1 

postid: इंट, पहचान (स्वत: वेतन वृद्धि), प्राथमिक कुंजी

postdate: DATETIME

संपादित करें: क्या हर कोई Row_Number() का उपयोग कर रहा है?

उत्तर

0

ठीक है, आपकी नमूना क्वेरी के लिए ROW_COUNT हजारों पंक्तियों के साथ बहुत तेज होना चाहिए, बशर्ते आपके पास अपने पोस्टडेट फ़ील्ड पर एक अनुक्रमणिका हो। यदि आप नहीं करते हैं, तो सर्वर को आपके पीके पर एक पूर्ण क्लस्टर इंडेक्स स्कैन करने की ज़रूरत है, व्यावहारिक रूप से प्रत्येक पृष्ठ को लोड करें, अपने पोस्टडेट फ़ील्ड को लाएं, इसके द्वारा क्रमबद्ध करें, परिणाम सेट के लिए निकालने के लिए पंक्तियों को निर्धारित करें और फिर उन पंक्तियों को प्राप्त करें। यह एक बार फिर से एक temp अनुक्रमणिका बनाने की तरह है (आप मैदान में एक टेबल/इंडेक्स स्पूल देख सकते हैं)।

कोई आश्चर्य नहीं कि आपको टाइमआउट मिलते हैं।

मेरे सुझाव: postdate DESC पर एक सूचकांक निर्धारित करते हैं, यह है कि क्या ROW_NUMBER की चर्चा करेंगे है - (postdate DESC द्वारा आदेश, ...)

लेख के लिए के रूप में आप बात कर रहे हैं - मैं बहुत किया है अतीत में SQL Server 2000 के साथ ROW_COUNT के बिना बहुत पेजिंग और सामान और आलेख में उपयोग किया जाने वाला दृष्टिकोण सबसे कुशल है। यह सभी परिस्थितियों में काम नहीं करता है (आपको अद्वितीय या लगभग अद्वितीय मानों की आवश्यकता है)। कुछ अन्य तरीकों का एक अवलोकन here है।

7

row_number() तकनीक त्वरित होनी चाहिए। मैंने 100,000 पंक्तियों के लिए अच्छे नतीजे देखे हैं।

आप ROW_NUMBER() समान उपयोग कर रहे हैं निम्नलिखित हैं:

SELECT column_list 
FROM 
    (SELECT column_list 
     ROW_NUMBER() OVER(ORDER BY OrderByColumnName) as RowNum 
    FROM MyTable m 
    ) as DerivedTableName 
WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1 

... और आप column_list और/या 'OrderByColumnName' कॉलम पर एक सूचकांक के लिए एक कवर सूचकांक क्या ज़रूरत है?

+0

आपके इनपुट के लिए धन्यवाद। मैंने अपना प्रश्न अपडेट किया। –

संबंधित मुद्दे