2009-12-13 3 views
7

Ich benutze ROW_NUMBER(), um mit dem Inhalt meiner Website zu blättern. Wenn Sie die letzte Seite drücken, wird die Zeit überschritten, weil der SQL Server zu lange braucht, um die Suche abzuschließen.ROW_NUMBER() OVER Nicht schnell genug mit großem Ergebnissatz, keine gute Lösung?

Es gibt bereits einen Artikel zu diesem Problem, aber es scheint noch keine perfekte Lösung zu sein.

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

Als ich die letzte Seite des Stackoverflow klicken dauert es weniger ein zweites eine Seite zurückzukehren, die wirklich schnell. Ich frage mich, ob sie einen wirklich schnellen Datenbankserver haben oder nur eine Lösung für das ROW_NUMBER() Problem haben?

Irgendeine Idee?

+1

Welche Version von SQL Server verwenden Sie? –

+0

Wie sehen Ihre Abfrage und Ihr Schema aus? – RickNZ

+0

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

Antwort

5

Jahre zurück, während mit SQL Server 2000 arbeiten, die diese Funktion nicht hatten, hatten wir das gleiche Problem.

Wir fanden diese Methode, die auf den ersten Blick aussieht, als ob die Leistung schlecht sein könnte, aber blies uns aus dem Wasser.

Versuchen dieses heraus

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

Dies ist, was ich wollte vorschlagen! Sie sollten auch die Reihenfolge nach Reihenfolge und Richtung parameterisieren, so dass die Ergebnisse nach mehreren Spalten sortiert werden können, was wahrscheinlich dynamische SQL erfordern wird. Ich würde auch die Anzahl der sortierbaren Spalten beschränken und Indizes anwenden, mit einem gruppierten Index für die Standard-Sortierspalte, sollten Sie eine gute Leistung sehen. –

2

Die Basis Logik dieser Methode auf dem SET ROWCOUNT Expression sowohl überspringen die unerwünschten Zeilen und holen Sie die gewünschten beruht:

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 

Die Ausgabe ist well covered in this CodeProject article, einschließlich Skalierbarkeitsgraphen.

TOP wird von SQL Server 2000 unterstützt, aber nur statische Werte. ZB keine "TOP (@var)" nur "TOP 200"

+1

TOP wird von SQL Server 2000 unterstützt, aber nur statische Werte. ZB nein "TOP (@Var)", nur "TOP 200" – gbn

Verwandte Themen