, , , ROW_NUMBER . , , , , , ?
, (-) , , .
, ROW_NUMBER , , , :
CREATE PROCEDURE dbo.usp_PagedResults_RowNumber
(
@startRowIndex int,
@maximumRows int
)
AS
WITH Emp AS
( SELECT e.*, rn = ROW_NUMBER() OVER(ORDER BY e.EmployeeID)
FROM employees e
)
SELECT TOP (@MaximumRows)
EmployeeID,
LastName,
FirstName,
e.DepartmentID,
Salary,
HireDate,
d.Name AS DepartmentName
FROM Emp e
INNER JOIN Departments D ON
e.DepartmentID = d.DepartmentID
WHERE rn >= @startRowIndex
ORDER BY EmployeeID;
:
EXECUTE usp_PageResults_NAI 4500, 20;
EXECUTE usp_PagedResults_RowNumber 4500, 20;
, IO, , , :
Table 'Employees'. Scan count 1, logical reads 48
(1 row(s) affected)
(20 row(s) affected)
Table 'Departments'. Scan count 1, logical reads 41
Table 'Employees'. Scan count 1, logical reads 2
(1 row(s) affected)
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0., .
ROW_NUMBER():
(20 row(s) affected)
Table 'Departments'. Scan count 1, logical reads 41
Table 'Employees'. Scan count 1, logical reads 48
(1 row(s) affected)
, ROW_NUMBER 2 .
. Rowcount 84% :

ROW_NUMBER - 16%.

, , . , IO ROW_NUMBER.
, ROWCOUNT FirstName, FirstName, ROW_NUMBER . .
CREATE NONCLUSTERED INDEX IX_Employees_FirstName ON dbo.Employees (FirstName ASC) INCLUDE (DepartmentID);
, :
SELECT EmployeeID,
DepartmentID,
RowNumber = ROW_NUMBER() OVER(ORDER BY FirstName, EmployeeID)
FROM Employees;
:
Table 'Employees'. Scan count 1, logical reads 501

Table 'Employees'. Scan count 1, logical reads 249

, , , .