如何在数据层进行分页以提高性能
如何在数据层进行分页以提高性能(转)
在读取大量数据的时候我们可以通过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![]()
CREATE PROCEDURE GetProducts2

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

5
@PageNumber INT, --页码6

7
@ProductsPerPage INT, --每页产品数 8

9
@HowManyProducts INT OUTPUT) --产品总数10

11
AS12

13
-- 定义一个Table变量14

15
DECLARE @Products TABLE16

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 @Products42

43
-- 返回请求页面的数据44

45
SELECT ProductID, Name, Description, Price46

47
FROM @Products48

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

51
AND RowNumber <= @PageNumber * @ProductsPerPage52

在SQLServer 2000中可以用以下的方法:
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 SMALLINT NOT NULL IDENTITY(1,1), --类型一定要自动递增
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 (ProductID, Name, Description, Price)
30![]()
31
SELECT
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![]()
CREATE PROCEDURE GetProducts2

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

5
@PageNumber INT, --页码6

7
@ProductsPerPage INT, --每页产品数 8

9
@HowManyProducts INT OUTPUT) --产品总数10

11
AS12

13
-- 定义一个Table变量14

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

17
(RowNumber SMALLINT NOT NULL IDENTITY(1,1), --类型一定要自动递增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 (ProductID, Name, Description, Price) 30

31
SELECT 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 #Products42

43
-- 返回请求页面的数据44

45
SELECT ProductID, Name, Description, Price46

47
FROM #Products48

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

51
AND RowNumber <= @PageNumber * @ProductsPerPage52

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


浙公网安备 33010602011771号