如果我有一个包含大量信息的查询(类似于几个视图,每个视图都会触及一些表,其中许多表有数万行),我只需要从中获取10条记录向用户显示,在支持SQL Server 2000的同时检索这些记录的最佳方式是性能吗?一旦我可以使用SQL Server 2005,ROW_NUMBER
似乎是明显的选择(如果我错了就纠正我),但在2000年该怎么做?
答案 0 :(得分:0)
Greg Hamilton has an article使用SET ROWCOUNT
和SELECT
进入变量,以避免引用不需要的行,并带来一些非常引人注目的性能结果。但是,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列。