2011-09-15 15 views
10

मैं डेटा की एक पेज लौट सकते हैं और यह भी सभी डेटा की गिनती पंक्ति एक संग्रहीत प्रक्रिया में कोशिश कर रहा हूँ जो ऐसा दिखाई देता है:CTE, ROW_NUMBER और ROWCOUNT

WITH Props AS 
(
    SELECT *, 
    ROW_NUMBER() OVER (ORDER BY PropertyID) AS RowNumber 
    FROM Property 
    WHERE PropertyType = @PropertyType AND ... 
) 

SELECT * FROM Props 
WHERE RowNumber BETWEEN ((@PageNumber - 1) * @PageSize) + 1 AND (@PageNumber * @PageSize); 

मैं (पंक्ति संख्या वापस करने में असमर्थ हूं उच्चतम पंक्ति संख्या)।

मैं जानता हूँ कि यह पहले से ही चर्चा की गई है (मैं इस देखा है: Efficient way of getting @@rowcount from a query using row_number) लेकिन जब मैं CTE प्रदर्शन में खराबी आ में COUNT (एक्स) से अधिक (1 द्वारा भाग) में जोड़ सकते हैं और है कि इसके बाद के संस्करण क्वेरी सामान्य रूप से लेता है निष्पादित करने के लिए हमेशा के लिए कोई समय नहीं लगता है। मुझे लगता है कि यह गणना प्रत्येक पंक्ति के लिए गणना की जाती है? मुझे लगता है कि मैं सीटीई को किसी अन्य प्रश्न में पुन: उपयोग नहीं कर सकता। टेबल प्रॉप्स में 100k रिकॉर्ड हैं, सीटीई 5k रिकॉर्ड लौटाता है।

+1

एक एसक्यूएल सर्वर प्रश्न के रूप में फिर से टैग करना चाहिए है। मैंने यह आपके लिए किया होगा, लेकिन आपको केवल 5 टैग की अनुमति है, और मुझे नहीं पता था कि आप कौन सा हटाना चाहते हैं। –

उत्तर

15

T-SQL में यह

;WITH Props AS 
(
    SELECT *, 
     ROW_NUMBER() OVER (ORDER BY PropertyID) AS RowNumber 
    FROM Property 
    WHERE PropertyType = @PropertyType AND ... 
) 

, Props2 AS 
(
    SELECT COUNT(*) CNT FROM Props 
) 

-- Now you can use even Props2.CNT 
SELECT * FROM Props, Props2 
WHERE RowNumber BETWEEN ((@PageNumber - 1) * @PageSize) + 1 AND (@PageNumber * @PageSize); 

अब होना चाहिए आप हर पंक्ति में CNT है ... या आप कुछ अलग करना चाहता था? आप केवल दूसरी गिनती के साथ एक दूसरा परिणाम चाहते थे? तो यह करो!

-- This could be the second result-set of your query. 
SELECT COUNT(*) CNT 
FROM Property 
WHERE PropertyType = @PropertyType AND ... 

नोट: reedited, क्वेरी 1 दाऊद अब trashcanned कर दिया गया है संदर्भित किया गया था, क्वेरी 2 अब क्वेरी 1.

+0

1. काम नहीं करता है क्योंकि आपको क्लॉज में समूह होना होगा। 2. सही काम करता है और मुझे यह सबसे अच्छा लगता है। धन्यवाद। – David

+0

मेरे संस्करण में मैंने पहले सीटी में COUNT (1) जोड़ा था जिसके कारण वर्कटेबल पर 800000 पढ़े गए थे। एक दूसरी सीटीई (जैसे आपने यहां किया) का उपयोग करके उन सभी पठनों को छोड़ दिया जिसके परिणामस्वरूप एक तेज तेज क्वेरी हुई। –

1

क्या आप पूरे परिणाम के लिए गिनती चाहते हैं?

यह काम तेजी से करता है?

SELECT *,(select MAX(RowNumber) from Props) as MaxRow 
FROM Props 
WHERE RowNumber BETWEEN ((@PageNumber - 1) * @PageSize) + 1 
    AND (@PageNumber * @PageSize); 
+0

सीसीए 10% रैखिक जो महान है जोड़ता है! अब अभी तक अन्य उत्तर का प्रयास करेगा .. – David

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