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

 

    在读取大量数据的时候我们可以通过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
53 None.gif

 

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

  

CREATE PROCEDURE GetProducts

(@DescriptionLength INT,           --定义参数:描述长度

@PageNumber INT,                --页码

@ProductsPerPage INT,             --每页产品数

@HowManyProducts INT OUTPUT) --产品总数

AS

-- 定义一个Table变量

DECLARE #Products TABLE           --这里一定要用‘#’(声明为本地临时表)

(RowNumber SMALLINT NOT NULL IDENTITY(1,1),    --类型一定要自动递增

 ProductID INT,

 Name VARCHAR(50),

 Description VARCHAR(5000)

Price MONEY)

-- 把数据读到刚定义的#Products 中

INSERT INTO #Products (ProductID, Name, Description, Price)  

SELECT

       ProductID, Name,

       SUBSTRING(Description, 1, @DescriptionLength) + '...' AS Description, Price,

FROM Product

-- 返回产品数

SELECT @HowManyProducts = COUNT(ProductID) FROM #Products

-- 返回请求页面的数据

SELECT ProductID, Name, Description, Price

FROM #Products

WHERE RowNumber > (@PageNumber - 1) * @ProductsPerPage

 AND RowNumber <= @PageNumber * @ProductsPerPage

 

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

转载于:https://www.cnblogs.com/timone/archive/2006/11/16/561950.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值