2010-09-19 7 views
9

Qual è la soluzione di paginazione più efficiente che utilizza SQL Server 2005 rispetto a una tabella con circa 5.000-10.000 righe? Ne ho visti parecchi là fuori ma niente li ha paragonati.La migliore soluzione di paging con SQL Server 2005?

+1

possibile duplicato di [ASP.NET, SQL 2005 "paging"] (http://stackoverflow.com/questions/1058825/asp-net-sql-2005-paging) – M4N

+0

Numerosi: http://stackoverflow.com/questions/tagged/pagination + sql-server –

risposta

22

Per una tabella di queste dimensioni, utilizzare un'espressione tabella comune (CTE) e ROW_NUMBER; utilizzare una piccola funzione per calcolare i record da riportare in base alle variabili @PageNumber e @PageSize (o qualsiasi altra cosa si voglia chiamare). Semplice esempio da uno dei nostri stored procedure:

-- calculate the record numbers that we need 

DECLARE @FirstRow INT, @LastRow INT 
SELECT @FirstRow = ((@PageNumber - 1) * @PageSize) + 1, 
     @LastRow = ((@PageNumber - 1) * @PageSize) + @PageSize 

; 
WITH CTE AS 
(
    SELECT [Fields] 
      , ROW_NUMBER() OVER (ORDER BY [Field] [ASC|DESC]) as RowNumber 
    FROM [Tables] 
    WHERE [Conditions, etc] 
) 
SELECT * 
     -- get the total records so the web layer can work out 
     -- how many pages there are 
     , (SELECT COUNT(*) FROM CTE) AS TotalRecords 
FROM CTE 
WHERE RowNumber BETWEEN @FirstRow AND @LastRow 
ORDER BY RowNumber ASC 
+0

Devi attendere l'esecuzione del proc una volta prima di poter ottenere il numero totale di pagine? – Caveatrob

+0

PS: funziona così bene finora! – Caveatrob

+0

Sì, il modo in cui lo facciamo è utilizzare i risultati del proc per compilare un piccolo oggetto di PagingInfo che gestisce il processo di scrittura dei collegamenti del numero di pagina. Supponendo che tu non stia facendo un numero pazzesco di join o chiamate di funzione nella query, questo bambino dovrebbe scappare quasi istantaneamente, quindi non è mai stato un problema per noi. Sono contento che stia lavorando per te :) –

1

Anche questo dovrebbe aiutare ..

SELECT * FROM 
( 
    SELECT Row_Number() OVER(order by USER_ID) As RowID, 
    COUNT (USER_ID) OVER (PARTITION BY null) AS TOTAL_ROWS, 
    select name from usertbl 
) 
As RowResults WHERE 
RowID Between 0 AND 25 

Non sono sicuro se il suo meglio di @keith versione.

Problemi correlati