2009-12-13 3 views
7

J'utilise ROW_NUMBER() pour faire du pagination avec le contenu de mon site Web et lorsque vous appuyez sur la dernière page, le délai expire car SQL Server met trop de temps à terminer la recherche.ROW_NUMBER() OVER pas assez rapide avec grand ensemble de résultats, une bonne solution?

Il existe déjà un article sur ce problème, mais il semble que ce ne soit pas encore une solution parfaite.

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

Lorsque je clique sur la dernière page du StackOverflow il faut moins d'une seconde pour revenir une page, ce qui est très rapide. Je me demande s'ils ont un serveur de base de données très rapide ou s'ils ont une solution pour le problème ROW_NUMBER()?

Une idée?

+1

Quelle version de Sql Server utilisez-vous? –

+0

À quoi ressemblent votre requête et votre schéma? – RickNZ

+0

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

Répondre

5

Il y a des années, en travaillant avec Sql Server 2000, qui n'avait pas cette fonction, nous avons eu le même problème.

Nous avons trouvé cette méthode qui, au premier abord, semble être une mauvaise performance, mais qui nous a fait perdre l'eau.

Essayez ceci

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

C'est ce que j'allais suggérer! Vous devez également paramétrer l'ordre par et la direction de sorte que les résultats peuvent être triés par plusieurs colonnes, ce qui nécessitera probablement SQL dynamique. Je voudrais également limiter le nombre de colonnes triables et appliquer des index, en utilisant un index cluster sur la colonne de tri par défaut, vous devriez voir de bonnes performances. –

2

La logique de base de cette méthode repose sur l'expression SET ROWCOUNT à la fois ignorer les lignes indésirables et chercher ceux souhaités:

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 

La question est well covered in this CodeProject article, y compris graphiques d'évolutivité.

TOP est pris en charge sur SQL Server 2000, mais uniquement les valeurs statiques. Par exemple, non "TOP (@Var)", seulement "TOP 200"

+1

TOP est pris en charge sur SQL Server 2000, mais uniquement les valeurs statiques. Par exemple, pas de "TOP (@Var)", seulement "TOP 200" – gbn

Questions connexes