Was ist der beste Weg (Leistung wise) zu paginieren Ergebnisse in SQL Server 2000, 2005, 2008, 2012, wenn Sie auch die Gesamtzahl der Ergebnisse (vor paginieren) erhalten möchten?
Antworten
Zu viele Anzeigen?Für die ROW_NUMBER
Technik können Sie, wenn Sie keine Sortierspalte haben, die Sie verwenden können, die CURRENT_TIMESTAMP
wie folgt:
SELECT TOP 20
col1,
col2,
col3,
col4
FROM (
SELECT
tbl.col1 AS col1
,tbl.col2 AS col2
,tbl.col3 AS col3
,tbl.col4 AS col4
,ROW_NUMBER() OVER (
ORDER BY CURRENT_TIMESTAMP
) AS sort_row
FROM dbo.MyTable tbl
) AS query
WHERE query.sort_row > 10
ORDER BY query.sort_row
Dies hat sich für mich bei Suchen über Tabellengrößen von bis zu 700.000 bewährt.
Damit werden die Datensätze 11 bis 30 abgerufen.
create PROCEDURE SP_Company_List (@pagesize int = -1 ,@pageindex int= 0 ) > AS BEGIN SET NOCOUNT ON; select Id , NameEn from Company ORDER by Id ASC OFFSET (@pageindex-1 )* @pagesize ROWS FETCH NEXt @pagesize ROWS ONLY END GO
DECLARE @return_value int EXEC @return_value = [dbo].[SP_Company_List] @pagesize = 1 , > @pageindex = 2 SELECT 'Return Value' = @return_value GO
Dieses Bit gibt Ihnen die Möglichkeit, mit SQL Server und neueren Versionen von MySQL zu paginieren und trägt die Gesamtzahl der Zeilen in jeder Zeile. Verwendet Ihren primären Schlüssel, um die Anzahl der eindeutigen Zeilen zu zählen.
WITH T AS
(
SELECT TABLE_ID, ROW_NUMBER() OVER (ORDER BY TABLE_ID) AS RN
, (SELECT COUNT(TABLE_ID) FROM TABLE) AS TOTAL
FROM TABLE (NOLOCK)
)
SELECT T2.FIELD1, T2.FIELD2, T2.FIELD3, T.TOTAL
FROM TABLE T2 (NOLOCK)
INNER JOIN T ON T2.TABLE_ID=T.TABLE_ID
WHERE T.RN >= 100
AND T.RN < 200
Sie haben weder die Sprache noch den Treiber angegeben, den Sie verwenden. Daher beschreibe ich es abstrakt.
- Erstellen Sie eine blätterbare Ergebnismenge/Datensatz. Dies erforderte eine Primärdatei für die Tabelle(n)
- zum Ende springen
- Abfrage der Zeilenzahl
- zum Anfang der Seite springen
- durch die Zeilen bis zum Ende der Seite blättern
- See previous answers
- Weitere Antworten anzeigen