2011-09-15 20 views
10

Sto cercando di restituire una pagina di dati e anche remare conteggio di tutti i dati in una stored procedure che si presenta come segue:CTE, ROW_NUMBER e 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); 

non sono in grado di restituire il conteggio delle righe (numero di riga più alto).

So che questo è già stato discusso (Ho visto questo: Efficient way of getting @@rowcount from a query using row_number), ma quando aggiungo COUNT (x) OVER (partizione DA 1) nelle prestazioni peggiorano CTE e la query sopra che normalmente non c'è bisogno di tempo per l'esecuzione. Suppongo che sia perché il conteggio è calcolato per ogni riga? Sembra che non riesca a riutilizzare il CTE in un'altra query. Table Props ha 100k records, CTE restituisce 5k records.

+1

caso sostituire i tag come una domanda di SQL Server. L'avrei fatto per te, ma hai solo 5 tag e non sapevo quale vorresti rimuovere. –

risposta

15

in T-SQL che dovrebbe essere

;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); 

ora avete CNT in ogni linea ... O si voleva qualcosa di diverso? Volevi un secondo set di risultati con solo il conteggio? Allora fallo!

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

Nota: rimontate, la query 1 David è stato riferimento a ora è stato Trashcanned, interrogare 2 è ora query 1.

+0

1. non funziona perché dovresti avere un gruppo per clausola in 2. funziona perfettamente e mi piace di più. Grazie. – David

+0

Nella mia versione avevo COUNT (1) aggiunto nel primo cte che ha causato 800000 letture sul worktable. L'utilizzo di un secondo cte (come hai fatto qui) ha saltato tutte quelle letture risultando in una query incredibilmente veloce. –

1

Vuoi il conteggio per l'intero set di risultati giusto?

funziona in senso orario?

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

aggiunge cca 10% lineary che è fantastico! ora proverò ancora l'altra risposta .. – David