询问者
使用row_number()进行分页的疑问

问题
-
随着页码数字的增加,会导致速度越来越慢,我发现“where row_numbers>(@pageSize*(@pageindex-1))”这段如果数字比较大的话,效率明显下降很多,是不是因为这个字段没有索引所导致在筛选的时候会全表检索而使得速度变得越来越慢。
CREATE procedure pro_A
(
@pageIndex int
@pageSize tinyint
)
as
select top(@pageSize) *
from
(
select *,row_number() over(order by pm_plancode asc) as row_numbers
from v_planmembers
) as t
where row_numbers>(@pageSize*(@pageindex-1))
全部回复
-
个人对这个函数用于分页是比较讨厌的,因为一般很少人会去考虑怎么用才是合理的(我是看到了一堆人用这个写了个通用的分页,还沾沾自喜的到处传播)
从执行计划上年,row_number是在查询结果集上去算这个值的,所以你的页越靠后,需要读取的数据就越多,自然也就越慢
正确的用法是只对主键分页,对分页得到的主键再去关联明细数据,也就是应该用类似下面的这种处理
with id as( select row_id = row_number() over(order by pm_plancode asc) id -- 主键列名 from v_planmembers ) select data.* from v_planmembers data inner join id on id.id = data.id where id.row_id >(@pageSize*(@pageindex-1)) and id.row_id < (@pageSize*(@pageindex)) ;
-
-
一般我都是用主表、临时表做分页的因为支持sql2000,比较通用,性能还可以
USE [GPOSDB] GO /****** 对象: StoredProcedure [dbo].[CT_Append_Get] 脚本日期: 06/29/2012 15:26:36 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ----------------------------------------------------------------- -- Name: CT_Append Store Procedure -- Author: -- DateTime: 2011-07-22 -- Description: Data TableCT_Append , Get List ----------------------------------------------------------------- /* @PageIndex @TotalRecords */ ALTER PROCEDURE [dbo].[CT_Append_Get] ( @PageIndex int, @TotalRecords int ) AS BEGIN DECLARE @Page int DECLARE @PageLowerBound int DECLARE @PageUpperBound int DECLARE @RowsToReturn int SET @Page = (@PageIndex - 1) -- First set the rowcount SET @RowsToReturn = @TotalRecords * (@Page + 1) SET ROWCOUNT @RowsToReturn -- Set the page bounds SET @PageLowerBound = @TotalRecords * @Page SET @PageUpperBound = @PageLowerBound + @TotalRecords + 1 -- Create a temp table to store the select results CREATE TABLE #PageIndex ( IndexId int IDENTITY (1, 1) NOT NULL, VC_A_SNNO INT ) INSERT INTO #PageIndex (VC_A_SNNO) SELECT [VC_A_SNNO] FROM [CT_Append] SELECT c.VC_A_SNNO, [VC_A_AppendType] , [VC_A_CardNO] , [I_A_CardType] , [I_A_PointToOil] , [VC_TicketType] , [VC_TicketNO] , [DE_A_BAmount] , [DE_A_AppendAmount] , [DE_A_AAmount] , [D_A_AppendDateTime] , [VC_A_Remark] , [VC_A_OperatorNO] FROM [CT_Append] c , #PageIndex PageIndex WHERE c.VC_A_SNNO = PageIndex.VC_A_SNNO AND PageIndex.IndexID > @PageLowerBound AND PageIndex.IndexID < @PageUpperBound SELECT COUNT(VC_A_SNNO) AS TotalRecords FROM [CT_Append] END
-
SQL Server 2012 已经原生支持 Paging. http://msdn.microsoft.com/en-us/library/ms188385.aspx
SELECT * FROM v_planmembers ORDER BY pm_plancode ASC OFFSET @pageSize*(@pageIndex-1) ROWS FETCH NEXT @pageSize ROWS ONLY
- 已建议为答案 Molly Chen_Moderator 2012年7月6日 9:06
-
-
SQL Server 2012 已经原生支持 Paging. http://msdn.microsoft.com/en-us/library/ms188385.aspx
SELECT * FROM v_planmembers ORDER BY pm_plancode ASC OFFSET @pageSize*(@pageIndex-1) ROWS FETCH NEXT @pageSize ROWS ONLY
测试了,这个分页和 row_number() 分页差不多,没有针对分页做专门的性能优化的,比较郁闷