和记娱乐


网站导航

联系我们

和记娱乐

联系人: 

电 话:021-64057486

公司网址:http://www.happy123456789.com

   址:成都市松江区漕河泾松江新兴产业园区研展路丰产支路55号B座803室

邮编:201165


通信科技

您的当前位置: 和记娱乐主页 > 通信科技 >

高效的SQLSERVER分页查询

发布日期:2019-12-28 09:15 来源:和记h88 发布人:和记娱乐 点击:

  Sqlserver数据库分页查询一直是Sqlserver的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID、YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页查询每页30条,查询第1500页(即第45001-45030条数据),字段ID聚集索引,YEAR无索引,Sqlserver版本:2008R2

  由此可见在查询页数靠前时,效率3>4>5>2>1,页码靠后时5>4>3>1>2,再根据用户习惯,一般用户的检索只看最前面几页,因此选择3 4 5方案均可,若综合考虑方案5是最好的选择,但是要注意SQL2000不支持row_number()函数,由于时间和条件的没有做更深入、范围更广的测试,有兴趣的可以仔细研究下。

  if exists (select * from dbo.sysobjects where id = object_id(N[dbo].[sys_Page_v2]) and OBJECTPROPERTY(id, NIsProcedure) = 1)   drop procedure [dbo].[sys_Page_v2]   GO   CREATE PROCEDURE [dbo].[sys_Page_v2]   @PCount int output,    --总页数输出   @RCount int output,    --总记录数输出   @sys_Table nvarchar(100),    --查询表名   @sys_Key varchar(50),        --主键   @sys_Fields nvarchar(500),    --查询字段   @sys_Where nvarchar(3000),    --查询条件   @sys_Order nvarchar(100),    --排序字段   @sys_Begin int,        --开始   @sys_PageIndex int,        --当前页数   @sys_PageSize int        --页大小   AS   SET NOCOUNT ON   SET ANSI_WARNINGS ON   IF @sys_PageSize < 0 OR @sys_PageIndex < 0   BEGIN           RETURN   END   DECLARE @new_where1 NVARCHAR(3000)   DECLARE @new_order1 NVARCHAR(100)   DECLARE @new_order2 NVARCHAR(100)   DECLARE @Sql NVARCHAR(4000)   DECLARE @SqlCount NVARCHAR(4000)   DECLARE @Top int   if(@sys_Begin <=0)       set @sys_Begin=0   else       set @sys_Begin=@sys_Begin-1   IF ISNULL(@sys_Where,) =        SET @new_where1 =     ELSE       SET @new_where1 =  WHERE  + @sys_Where   IF ISNULL(@sys_Order,) <>     BEGIN       SET @new_order1 =  ORDER BY  + Replace(@sys_Order,desc,)       SET @new_order1 = Replace(@new_order1,asc,desc)       SET @new_order2 =  ORDER BY  + @sys_Order   END   ELSE   BEGIN       SET @new_order1 =  ORDER BY ID DESC       SET @new_order2 =  ORDER BY ID ASC   END   SET @SqlCount = SELECT @RCount=COUNT(1),@PCount=CEILING((COUNT(1)+0.0)/               + CAST(@sys_PageSize AS NVARCHAR)+) FROM  + @sys_Table + @new_where1   EXEC SP_EXECUTESQL @SqlCount,N@RCount INT OUTPUT,@PCount INT OUTPUT,                  @RCount OUTPUT,@PCount OUTPUT   IF @sys_PageIndex > CEILING((@RCount+0.0)/@sys_PageSize)    --如果输入的当前页数大于实际总页数,则把实际总页数赋值给当前页数   BEGIN       SET @sys_PageIndex =  CEILING((@RCount+0.0)/@sys_PageSize)   END   set @sql = select + @sys_fields + from  + @sys_Table +  w1        +  where + @sys_Key + in (           +select top + ltrim(str(@sys_PageSize)) +  + @sys_Key +  from            +(               +select top  + ltrim(STR(@sys_PageSize * @sys_PageIndex + @sys_Begin)) +   + @sys_Key +  FROM            + @sys_Table + @new_where1 + @new_order2            +) w  + @new_order1       +)  + @new_order2   print(@sql)   Exec(@sql)   GO

      和记娱乐,和记h88,h88平台官网