Paging med Stored Procedures
Ofte ønsker man å presentere data fra en database i en applikasjon eller på nettet. Men ofte er det fryktelig mye data.
Det er da man trenger paging. Paging er å presentere litt data om gangen over flere sider slik at brukeren
kan ble seg fra side til side. i .NET ligger det innebygget støtte for paging bl.a. i DataGrid, men dersom det
er mye data i tabellen er det ikke en god måte å page på. Dette har med ytelse å gjøre, men med små datamengder er
det et godt alternativ som er veldig enkelt å sette opp.
Paging med DataGrid og SqlDataSource i .NET
Den enkleste måten å page på er vha den innebygde støtten for paging i asp:DataGrid. Du trenger en DataSource
og en DataGrid. Eksempelet er så enkelt at det ikke trenger så mye forklaring. Her er koden:
paging.aspx
<asp:SqlDataSource
runat="server"
ID="ds"
ConnectionString="<%$ ConnectionStrings:ConnString %>"
SelectCommand="SELECT * FROM Users" />
<asp:DataGrid
runat="server"
ID="dtgData"
DataSourceID="ds"
AllowPaging="true"
PageSize="5"
OnPageIndexChanged="dtgData_PageIndexChanged" />
Paging.aspx.cs
protected void dtgData_PageIndexChanged(object source, DataGridPageChangedEventArgs e)
{
dtgData.CurrentPageIndex = e.NewPageIndex;
dtgData.DataBind();
}
Så enkelt kan det gjøres, men som nevnt tidligere er dette en metode som ikke egner seg for store tabeller.
kilde serverside.no
Paging med ROWCOUNT i SQL Stored Procedure
Det finnes flere måter å lage paging på, men etter å ha testet noen ulike varianter og lest en del på nettet er det helt
tydlig en måte som er bedre enn alle de andre. Mange bruker #temp tabeller i SQL og det fungerer, men ved å bruke ROWCOUNT
kan man øke ytelsen betraktelig.
Eksempel-data
| UserId (PK) |
FirstName |
LastName |
| 1 |
Scott |
Taylor |
| 2 |
James |
Hamilton |
| 3 |
Steve |
Craft |
| 4 |
John |
Belushi |
CREATE PROCEDURE spPaging
(
@PageSize int,
@PageNumber int
)
AS
DECLARE @StartID int
DECLARE @FirstID int
DECLARE @LastID int
SET ROWCOUNT 1
SELECT @StartID = UserId FROM Users Order BY UserId
SET ROWCOUNT 0
SELECT @LastID = (@PageSize * @PageNumber) + @StartID
SELECT @FirstID = (@PageSize * (@PageNumber-1)) + @StartID
SET ROWCOUNT @PageSize
SELECT UserId, FirstName, LastName FROM Users
WHERE (UserId >= @FirstID) AND (UserId < @LastID)
ORDER BY UserId
SET ROWCOUNT 0
GO
Legg inn litt flere rader i Users tabellen og test prosedyren med følgende SQL-script
SELECT * FROM Users
EXEC spPaging @PageSize = 3, @PageNumber = 1
EXEC spPaging @PageSize = 3, @PageNumber = 2
EXEC spPaging @PageSize = 3, @PageNumber = 3
Dette er trolig den mest effektive måten å lage paging i SQL på. Både mtp prosessorbruk,
antall reads i databasen og tid det tar å kjøre scriptet. I tillegg er metoden relativt enkel i forhold
til bruk av temp-tabeller og table-varianter.
kilde 4GuysFromRolla.com