2009-12-13 10 views
7

Uso ROW_NUMBER() per eseguire il paging con il contenuto del mio sito Web e quando si preme l'ultima pagina, viene scaduto perché SQL Server impiega troppo tempo per completare la ricerca.ROW_NUMBER() SOPRA Non abbastanza veloce con il set di risultati grandi, una buona soluzione?

C'è già un articolo su questo problema ma non sembra ancora la soluzione perfetta.

http://weblogs.asp.net/eporter/archive/2006/10/17/ROW5F00NUMBER28002900-OVER-Not-Fast-Enough-With-Large-Result-Set.aspx

Quando scatto l'ultima pagina del StackOverflow ci vuole meno di un secondo per restituire una pagina, che è veramente veloce. Mi chiedo se hanno un server di database veloce o semplicemente hanno una soluzione per il problema ROW_NUMBER()?

Qualche idea?

+1

Quale versione di Sql Server stai usando? –

+0

Che aspetto hanno la tua query e il tuo schema? – RickNZ

+0

Link aggiornato: http://weblogs.asp.net/eporter/archive/2006/10/17/ROW_5F00_NUMBER_28002900_-OVER-Not-Fast-Enough-With-Large-Result-Set.aspx –

risposta

5

Anni fa, mentre lavoravamo con Sql Server 2000, che non aveva questa funzione, avevamo lo stesso problema.

Abbiamo trovato questo metodo, che a prima vista sembra che le prestazioni possono essere cattive, ma ci ha fatto esplodere l'acqua.

Prova questo

DECLARE @Table TABLE(
     ID INT PRIMARY KEY 
) 

--insert some values, as many as required. 

DECLARE @I INT 
SET @I = 0 
WHILE @I < 100000 
BEGIN 
    INSERT INTO @Table SELECT @I 
    SET @I = @I + 1 
END 

DECLARE @Start INT, 
     @Count INT 

SELECT @Start = 10001, 
     @Count = 50 

SELECT * 
FROM (  
      SELECT TOP (@Count) 
        * 
      FROM (
         SELECT TOP (@Start + @Count) 
           * 
         FROM @Table 
         ORDER BY ID ASC 
        ) TopAsc 
      ORDER BY ID DESC 
     ) TopDesc 
ORDER BY ID 
+0

Questo è quello che stavo andando suggerire! È inoltre necessario parametrizzare l'ordine e la direzione in modo che i risultati possano essere ordinati in base a più colonne, il che richiederà probabilmente SQL dinamico. Vorrei anche limitare il numero di colonne ordinabili e applicare indici, utilizzando un indice cluster sulla colonna di ordinamento predefinita, dovresti vedere buone prestazioni. –

2

La logica di base di questo metodo si basa sul SET ROWCOUNT espressione sia saltare le righe indesiderate e recuperare quelli desiderati:

DECLARE @Sort /* the type of the sorting column */ 
SET ROWCOUNT @StartRow 
SELECT @Sort = SortColumn FROM Table ORDER BY SortColumn 
SET ROWCOUNT @PageSize 
SELECT ... FROM Table WHERE SortColumn >= @Sort ORDER BY SortColumn 

Il problema è well covered in this CodeProject article, compresi grafici di scalabilità.

TOP è supportato su SQL Server 2000, ma solo valori statici. Ad es. "TOP (@Var)", solo "TOP 200"

+1

TOP è supportato su SQL Server 2000, ma solo valori statici. Per esempio no "TOP (@Var)", solo "TOP 200" – gbn

Problemi correlati