如何在数据层进行分页以提高性能

如何在数据层进行分页以提高性能(转)


    在读取大量数据的时候我们可以通过DataReader对数据进行分页以提高性能,还有一个更好的方法就是在存储过程中对数据进行分页。

    假设有一个Products表字段有(ProductID,Name,Description, Price)

    以下方法只支持SQLServer 2005 因为ROW_NUMBER()函数是SQLServer 2005新增的。

 

 

 1 None.gif CREATE  PROCEDURE  GetProducts
 2 None.gif
 3 None.gif( @DescriptionLength  INT ,            -- 定义参数:描述长度
 4 None.gif
 5 None.gif @PageNumber  INT ,                 -- 页码
 6 None.gif
 7 None.gif @ProductsPerPage  INT ,              -- 每页产品数 
 8 None.gif
 9 None.gif @HowManyProducts  INT  OUTPUT)   -- 产品总数
10 None.gif
11 None.gif AS
12 None.gif
13 None.gif --  定义一个Table变量
14 None.gif
15 None.gif DECLARE  @Products  TABLE
16 None.gif
17 None.gif(RowNumber  INT ,
18 None.gif
19 None.gif ProductID  INT , 
20 None.gif
21 None.gif Name  VARCHAR ( 50 ), 
22 None.gif
23 None.gif Description  VARCHAR ( 5000 )
24 None.gif
25 None.gifPrice  MONEY )
26 None.gif
27 None.gif --  把数据读到刚定义的@Products 中
28 None.gif
29 None.gif INSERT  INTO  @Products     
30 None.gif
31 None.gif SELECT  ROW_NUMBER()  OVER  ( ORDER  BY  Product.ProductID), 
32 None.gif
33 None.gif       ProductID, Name, 
34 None.gif
35 None.gif        SUBSTRING (Description,  1 ,  @DescriptionLength )  +  ' dot.gif '  AS  Description, Price,
36 None.gif
37 None.gif FROM  Product 
38 None.gif
39 None.gif --  返回产品数
40 None.gif
41 None.gif SELECT  @HowManyProducts  =  COUNT (ProductID)  FROM  @Products
42 None.gif
43 None.gif --  返回请求页面的数据
44 None.gif
45 None.gif SELECT  ProductID, Name, Description, Price
46 None.gif
47 None.gif FROM  @Products
48 None.gif
49 None.gif WHERE  RowNumber  >  ( @PageNumber  -  1 )  *  @ProductsPerPage  
50 None.gif
51 None.gif   AND  RowNumber  <=  @PageNumber  *  @ProductsPerPage
52 None.gif

 

在SQLServer 2000中可以用以下的方法:

 

 

 1 None.gif CREATE  PROCEDURE  GetProducts
 2 None.gif
 3 None.gif( @DescriptionLength  INT ,            -- 定义参数:描述长度
 4 None.gif
 5 None.gif @PageNumber  INT ,                 -- 页码
 6 None.gif
 7 None.gif @ProductsPerPage  INT ,              -- 每页产品数 
 8 None.gif
 9 None.gif @HowManyProducts  INT  OUTPUT)   -- 产品总数
10 None.gif
11 None.gif AS
12 None.gif
13 None.gif --  定义一个Table变量
14 None.gif
15 None.gif DECLARE  #Products  TABLE             -- 这里一定要用‘#’(声明为本地临时表)
16 None.gif
17 None.gif(RowNumber  SMALLINT  NOT  NULL  IDENTITY ( 1 , 1 ),     -- 类型一定要自动递增
18 None.gif
19 None.gif ProductID  INT , 
20 None.gif
21 None.gif Name  VARCHAR ( 50 ), 
22 None.gif
23 None.gif Description  VARCHAR ( 5000 )
24 None.gif
25 None.gifPrice  MONEY )
26 None.gif
27 None.gif --  把数据读到刚定义的#Products 中
28 None.gif
29 None.gif INSERT  INTO  #Products (ProductID, Name, Description, Price)   
30 None.gif
31 None.gif SELECT  
32 None.gif
33 None.gif       ProductID, Name, 
34 None.gif
35 None.gif        SUBSTRING (Description,  1 ,  @DescriptionLength )  +  ' dot.gif '  AS  Description, Price,
36 None.gif
37 None.gif FROM  Product 
38 None.gif
39 None.gif --  返回产品数
40 None.gif
41 None.gif SELECT  @HowManyProducts  =  COUNT (ProductID)  FROM  #Products
42 None.gif
43 None.gif --  返回请求页面的数据
44 None.gif
45 None.gif SELECT  ProductID, Name, Description, Price
46 None.gif
47 None.gif FROM  #Products
48 None.gif
49 None.gif WHERE  RowNumber  >  ( @PageNumber  -  1 )  *  @ProductsPerPage  
50 None.gif
51 None.gif   AND  RowNumber  <=  @PageNumber  *  @ProductsPerPage
52 None.gif

 

 

大家都清楚了吧,这种方法比在DataReader中速度高效。

转载于:https://www.cnblogs.com/sliuqin/archive/2007/08/13/854148.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值