Datenbanken

Server-seitiges Paging mit SQL-Server 2005

Einige ASP.NET-Controls besitzen die Möglichkeit zum seitenweisen Anzeigen der übergebenen Daten (Paging), was auf den ersten Blick sehr sinnvoll ist, um dem Benutzer nicht endlos scrollen lassen zu müssen. Ein Klick auf "nächste Seite" und die nächsten 20 Treffer werden angezeigt. Auf den ersten Blick eine schicke Sache, auf den zweiten aber nicht besonders effizient, denn die gesamten Daten, werden von der ASP.NET.Applikation im Speicher gehalten!

Die bessere Alternative ist ja wohl, sich immer nur die Datenmenge vom Datenbank-Server zu holen, die in dem Moment gebraucht wird, also SQL-Server-Paging zu implementieren.

Bis einschließlich SQL-Server 2000 war ein effizientes serverseitiges Paging mittels T-SQL nicht immer ein Vergnügen. Entweder man pumpte die Daten über eine Stored-Procedure in temporäre Tabellen und ließ sich den Teil der Daten zurückgeben den man gerade brauchte oder man erzeugte dynamisches SQL, was auf die Dauer nur sehr schlecht wartbar war.

Mit der Veröffentlichung der 2005'er-Version des SQL-Servers hielt ein Feature Einzug, daß sich wunderbar für Paging nutzen lässt: ROW_NUMBER.

Kurz etwas zum Feature selbst, auf das Entwickler lange gewartet haben:

Mittels ROW_NUMBER ist man in der Lage dem Resultset einer beliebigen T-SQL-Abfrage Zeilennummer zu verleihen. Zum Beispiel:

SELECT
	ROW_NUMBER() OVER(ORDER BY ModifiedDate DESC) AS 'RowNr',
	FirstName,
	LastName
FROM AdventureWorks.Person.Contact
WHERE EmailPromotion = 2

RowNr   FirstName      LastName
------  -------------  --------------
1       Humberto       Acevedo
2       Gustavo        Achong
3       Kate           Xie
4       Bianca         Hu
5       Christina      Morris
6       Rebecca        Nicholls
...

Über das Argument partition_by_clause kann man sogar Zeilennummern innerhalb einer Gruppe von Datensätzen erzeugen, aber das nur am Rande.

Mit dieser Zeilennummer hat man nun das Werkzeug in der Hand, um über eine Stored-Procedure sehr effektiv ein server-seitiges Paging zu implementieren:

CREATE PROCEDURE procContactsForPromotion
	@Page INT,
	@PageSize INT
AS
BEGIN
	SET NOCOUNT ON;

	WITH rsContacts AS
	(
		SELECT
			ROW_NUMBER() OVER(ORDER BY ModifiedDate DESC) AS 'RowNr',
			FirstName,
			LastName
		FROM AdventureWorks.Person.Contact
		WHERE EmailPromotion = 2
	)

	SELECT *
	FROM rsContacts
	WHERE RowNr BETWEEN (@Page - 1) * @PageSize + 1
		AND @Page * @PageSize
END

Einfacher und performanter gehts nicht. Folgender Aufruf gibt für dieses Beispiel die Datensätze 31 bis 40 aus:

EXEC procContactsForPromotion @Page = 4, @PageSize = 10
kick it on dotnet-kicks.de AddThis Trackback-Url...

227 Kommentare bislang...

  • There was so little hint of the aristocrat in cheap sale uk
    Lemuel Shackford's sordid life and person that no one suspected him of even self-esteem. He went as meanly dressed as a tramp, and as cheap trainers
    careless of contemporary criticism; yet clear down in his liver, or somewhere in his anatomy, he nourished an odd abstract pride in the family Shackford. Heaven knows why! To be sure, it dated far back; its women had always been virtuous, boots and trainers sale and its men, if not always virtuous, had always been ship-captains.
    227
    boots and trainers sale : Freitag, 3. Februar 2012 03:38
  • The outcome Coach Outlet of the race, his advisers argued,he had the same percentage of Coach Factory Outlet Tea Party supporters,he also seemed to gain strength Chanel Bags among Tea Party supporters.
    226
    Coach Outlet : Mittwoch, 1. Februar 2012 03:49
  • Wow, really great information sharing. I have already read so much on this topic but your this article has answered so many questions in my mind. <a href="http://www.wallscorner.com"> wallpaper</a>
    225
    wallpaper : Samstag, 28. Januar 2012 13:39
  • I wonder how you got so good. This is really a fascinating blog, lots of stuff that I can get into. One thing I just want to say is that your Blog is so perfect!
    224
    Kamagra : Dienstag, 24. Januar 2012 13:24
  • I wonder how you got so good. This is really a fascinating blog, lots of stuff that I can get into. One thing I just want to say is that your Blog is so perfect!
    223
    Kamagra : Dienstag, 24. Januar 2012 13:23

Dein Kommentar hierzu...


Kommentar-Feed für diesen Beitrag
Gravatare werden unterstützt .:. eMail-Adressen werden nicht veröffentlicht
 

RSS-Feed

Die URL des Standard-Newsfeed von zerbit.de lautet:

http://www.zerbit.de/rssfeed.aspx

Login


 

 

Statistik



kürzlich kommentiert

Artikel 263

  • Datum: 03.06.2008
    Kategorie: Datenbanken
    Zugriffe: 6.795
    Kommentare: 227
    Trackbacks: 0

Letzte Beiträge

Kategorien

Buttons & More

Blog-Roll

Banner Piraten-Partei