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

时间:2021-02-11 19:39:49

 

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

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

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

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

 

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中速度高效。