在SQL Server 2000中分页大量数据的最有效方法是什么?

时间:2011-01-06 21:11:03

标签: sql-server performance sql-server-2000 paging

如果我有一个包含大量信息的查询(类似于几个视图,每个视图都会触及一些表,其中许多表有数万行),我只需要从中获取10条记录向用户显示,在支持SQL Server 2000的同时检索这些记录的最佳方式是性能吗?一旦我可以使用SQL Server 2005,ROW_NUMBER似乎是明显的选择(如果我错了就纠正我),但在2000年该怎么做?

1 个答案:

答案 0 :(得分:0)

Greg Hamilton has an article使用SET ROWCOUNTSELECT进入变量,以避免引用不需要的行,并带来一些非常引人注目的性能结果。但是,MSDN says

  

如果在选择列表中引用了变量,则应为其分配标量值,否则SELECT语句应仅返回一行。

然后它继续说

  

请注意,只有在分配中有引用时才会显示效果。

     

如果SELECT语句返回多行并且该变量引用非标量表达式,则该变量将设置为在结果集的最后一行中为表达式返回的值。

表明在这种情况下它确实没问题(对吧?)

Greg最终得到了这个:

CREATE  PROCEDURE [dbo].[usp_PageResults_NAI] 
(
    @startRowIndex int,
    @maximumRows int
)
AS

DECLARE @first_id int, @startRow int

-- A check can be added to make sure @startRowIndex isn't > count(1)
-- from employees before doing any actual work unless it is guaranteed
-- the caller won't do that

-- Get the first employeeID for our page of records
SET ROWCOUNT @startRowIndex
SELECT @first_id = employeeID FROM employees ORDER BY employeeid

-- Now, set the row count to MaximumRows and get
-- all records >= @first_id
SET ROWCOUNT @maximumRows

SELECT e.*, d.name as DepartmentName 
FROM employees e
   INNER JOIN Departments D ON
       e.DepartmentID = d.DepartmentID
WHERE employeeid >= @first_id
ORDER BY e.EmployeeID

SET ROWCOUNT 0

GO 

此方法假设您有一个唯一的ID来排序,我不认为您在排序时可以使用此方法,例如,非唯一的DateTime列。