I have an Employee
table that has one million records. I have following SQL for paging data in a web application. It is working fine. However what I see as an issue is – the derived table tblEmployee
selects all records in the Employee
table (to create the MyRowNumber
values).
I think, this causes selection of all records in the Employee
table.
Does it really work so? Or is SQL Server optimized to select only the 5 records from the original Employee
table too?
DECLARE @Index INT;
DECLARE @PageSize INT;
SET @Index = 3;
SET @PageSize = 5;
SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY EmpID asc) as MyRowNumber,*
FROM Employee) tblEmployee
WHERE MyRowNumber BETWEEN ( ((@Index - 1) * @PageSize )+ 1) AND @Index*@PageSize
Best Answer
An alternative to test might be:
Yes, you hit the table twice, but in the CTE where you scan the whole table you are only grabbing the key, not ALL of the data. But you really should look at this article:
http://www.sqlservercentral.com/articles/T-SQL/66030/
And the follow-up discussion:
http://www.sqlservercentral.com/Forums/Topic672980-329-1.aspx
In SQL Server 2012 of course you can use the new
OFFSET
/FETCH NEXT
syntax:I also blogged about this in more detail here: