SqlServer,ACCESS最快的分页函数

  1. /// <summary>
  2.     /// 对有集聚索引的表(例如表具有唯一值的主健)获取分页的SQL
  3.     /// </summary>
  4.     /// <param name="tableName">表名称</param>
  5.     /// <param name="selectFields">要选择的列表字段,用逗号分隔</param>
  6.     /// <param name="pkName">主键字段</param>
  7.     /// <param name="condition">条件</param>
  8.     /// <param name="isDESC">是否倒排</param>
  9.     /// <param name="pageSize">页大小</param>
  10.     /// <param name="pageNumber">页码</param>
  11.     /// <param name="allCount">总记录数</param>
  12.     /// <returns></returns>
  13.     public static string GetSqlPageByPK(string tableName,string selectFields,string pkName,string condition,bool isDESC,int pageSize,int pageNumber,int allCount)
  14.     {
  15.         string strSqlTemp = "";
  16.         if (isDESC)
  17.         {
  18.             if (pageNumber <= 1)
  19.                 strSqlTemp = "SELECT TOP @Size @Fields FROM @Table WHERE 1=1 @Condition ORDER BY @PK DESC";
  20.             else
  21.                 strSqlTemp = @"
  22. SELECT TOP @Size @Fields
  23. FROM @Table
  24. WHERE @PK <
  25. (SELECT MIN(@PK) FROM
  26. (SELECT TOP @CurrCount @PK FROM @Table WHERE 1=1 @Condition ORDER BY @PK DESC) as T
  27. )
  28. ORDER BY @PK DESC
  29. ";
  30.         }
  31.         else
  32.         {
  33.             if (pageNumber <= 1)
  34.                 strSqlTemp = "SELECT TOP @Size @Fields FROM @Table WHERE 1=1 @Condition ORDER BY @PK ";
  35.             else
  36.                 strSqlTemp = @"
  37. SELECT TOP @Size @Fields
  38. FROM @Table
  39. WHERE @PK >
  40. (SELECT MAX(@PK) FROM
  41. (SELECT TOP @CurrCount @PK FROM @Table WHERE 1=1 @Condition ORDER BY @PK ) as T
  42. )
  43. ORDER BY @PK 
  44. ";
  45.         }
  46.         //
  47.         int iCurrCount = (pageNumber - 1) * pageSize;
  48.         if (iCurrCount + pageSize > allCount)
  49.             pageSize = allCount - iCurrCount;
  50.         string SQL = strSqlTemp.Replace("@Size", pageSize.ToString ())
  51.             .Replace("@Fields", selectFields)
  52.             .Replace("@Table", tableName)
  53.             .Replace("@PK", pkName)
  54.             .Replace("@Condition",condition);
  55.         if(pageNumber>1)
  56.             SQL = SQL.Replace("@CurrCount", iCurrCount.ToString ());
  57.         return SQL;
  58.     }

 * 最快速的 分页 函数

适用于有唯一值 的集聚索引的快速分页,可以适用于千万级别的分页

算法如下:

--最快的分页算法 ,使用于2-N 页 倒序,当前查询的是第 3 页
--10=(3-1)*2

select top 5 *
from TB
where id <
(select min(id) from
(select top 10 id from TB order by id desc) as T
)
order by id desc

---------------


--------------
--最快的分页算法 ,使用于2-N 页 升序,当前查询的是第 3 页
--10=(3-1)*2

select top 5 *
from TB
where id >
(select max(id) from
(select top 10 id from TB order by id asc) as T
)
order by id asc

注:需要计算最末页的数量

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值