毫秒级百万数据分页存储过程
2010-11-26 13:04
260 查看
数据分页一直是一个经久不衰的话题,在园子里看到了N多高手,都比我厉害,
今天把我使用的分页代码继续分享;请高手手下留情,少拍砖啦...哈哈;
欢迎大家转载!!!!
首先参考园子里的高手方法生成一个百万数据表;耗时33秒;
然后创建分页存储过程;这个是基于SQL2005的ROW_NUMBER的,SQL2000不适用;SQL2008我没有安装,所以也没有测试过!估计应该可以运行.
2种算法可以选择1.使用BETWEEN;2.TOP;代码中已经注释了.
我测试了一下2种方法基本没有什么区别;代码如下:
viewsource
print?
然后测试分页性能;每页显示20条记录,百万数据最大50000页,当前页采用随机数取值;
viewsource
print?
在我的机器上面测试均为毫秒级!!!!
园子里的高手若有更好的方法欢迎分享一下!!!!!!!!!!!!!!!
if($!=jQuery){
$=jQuery.noConflict();
}
今天把我使用的分页代码继续分享;请高手手下留情,少拍砖啦...哈哈;
欢迎大家转载!!!!
首先参考园子里的高手方法生成一个百万数据表;耗时33秒;
然后创建分页存储过程;这个是基于SQL2005的ROW_NUMBER的,SQL2000不适用;SQL2008我没有安装,所以也没有测试过!估计应该可以运行.
2种算法可以选择1.使用BETWEEN;2.TOP;代码中已经注释了.
我测试了一下2种方法基本没有什么区别;代码如下:
01 | USE[DATA_TEMP] |
02 | GO |
03 | /******对象:StoredProcedure[dbo].[im531_Page]脚本日期:11/26/201010:52:35******/ |
04 | SET ANSI_NULLS ON |
05 | GO |
06 | SET QUOTED_IDENTIFIER ON |
07 | GO |
08 |
09 | --============================================= |
10 | --Author:im531 |
11 | --Createdate:2010-10-25 |
12 | --Description:SQL2005ROW_NUMBER分页 |
13 | --ModifyDate:2010-10-26 |
14 | --============================================= |
15 |
16 | CREATE PROCEDURE [dbo].[im531_Page] |
17 | @TabeName AS NVARCHAR(50), |
18 | @Fields AS NVARCHAR(1024), |
19 | @SearchWhere AS NVARCHAR(1024), |
20 | @OrderFields AS NVARCHAR(1024), |
21 | @pageNumber AS INT , |
22 | @page AS INT |
23 | AS |
24 | BEGIN |
25 | SET NOCOUNT ON ; |
26 | DECLARE @sqlType AS TINYINT |
27 | SET @sqlType=0 --0BETWEEN1TOP |
28 | DECLARE @sql AS NVARCHAR( MAX ) |
29 | IF@SearchWhere<> '' SET @SearchWhere= 'WHERE' +@SearchWhere |
30 | IF@page<2 SET @page=1 |
31 | IF@page=1 |
32 | BEGIN |
33 | SET @sql= 'SELECTTOP' + CONVERT (NVARCHAR(20),@pageNumber)+ '' +@Fields |
34 | + 'FROM[' +@TabeName+ '][a]WITH(NOLOCK)' +@SearchWhere+ 'ORDERBY' +@OrderFields |
35 | END |
36 | ELSE |
37 | BEGIN |
38 | --临时表 |
39 | SET @sql= ';WITH[Page_____Table]AS(' |
40 | + 'SELECTROW_NUMBER()OVER(ORDERBY' +@OrderFields+ ')AS[RowNow],' +@Fields |
41 | + 'FROM[' +@TabeName+ '][a]WITH(NOLOCK)' +@SearchWhere |
42 | + ')' |
43 | --查找当前页面记录 |
44 | IF@sqlType=0 |
45 | BEGIN |
46 | --AUSEBETWEEN |
47 | SET @sql=@sql+ 'SELECT*' |
48 | + 'FROM[Page_____Table]WITH(NOLOCK)' |
49 | + 'WHERE[RowNow]BETWEEN' + CONVERT (NVARCHAR(20),(@page-1)*@pageNumber+1)+ 'AND' + CONVERT (NVARCHAR(20),@page*@pageNumber) |
50 | + 'ORDERBY[RowNow]' |
51 | END |
52 | ELSE |
53 | BEGIN |
54 | --BUSETOP |
55 | SET @sql=@sql+ 'SELECTTOP' + CONVERT (NVARCHAR(20),@pageNumber)+ '*' |
56 | + 'FROM[Page_____Table]WITH(NOLOCK)' |
57 | + 'WHERE[RowNow]>' + CONVERT (NVARCHAR(20),(@page-1)*@pageNumber) |
58 | + 'ORDERBY[RowNow]' |
59 | END |
60 | END |
61 | EXEC (@sql) |
62 | END |
01 | DECLARE @dDATETIME |
02 | SET @d=GETDATE() |
03 |
04 | DECLARE @M AS INT ; DECLARE @N AS INT ; DECLARE @cPage AS INT |
05 | SET @M=50000; SET @N=1 |
06 | SET @cPage= CAST ((rand()*(@M-@N)+@N) AS INT ) |
07 |
08 | EXECUTE [im531_Page] |
09 | @TabeName= 'Table_1' , |
10 | @Fields= '[a],' , |
11 | @SearchWhere= '[a]>0' , |
12 | @OrderFields= '[a]DESC' , |
13 | @pageNumber=20, |
14 | @page=@cPage |
15 |
16 |
17 | [b]SELECT [当前页]=@cPage,[分页执行耗时间(毫秒)]=DATEDIFF(ms,@d,GETDATE()) |
园子里的高手若有更好的方法欢迎分享一下!!!!!!!!!!!!!!!
if($!=jQuery){
$=jQuery.noConflict();
}
相关文章推荐
- 毫秒级百万数据分页存储过程
- 毫秒级百万数据分页存储过程[供学习用]
- 毫秒级百万数据分页存储过程[欢迎转载]【转】
- 毫秒级百万数据分页存储过程[欢迎转载]
- 毫秒级百万数据分页存储过程
- 毫秒级百万数据分页存储过程[欢迎转载]
- 毫秒级百万数据分页存储过程
- 毫秒级百万数据分页存储过程[转载]
- 毫秒级百万数据分页存储过程[欢迎转载]
- 一个高效的数据分页的存储过程 可以轻松应付百万数据
- 高性能的存储过程分页(特别是上万条数据有明显效果)
- 存储过程大数据通用高效分页(不带条件和排序)
- 实现千万级数据分页的存储过程!
- 一个高效的数据分页的存储过程 可以轻松应付百万数据
- DB2数据分页--存储过程
- 百万级数据分页存储过程代码
- 一个将数据分页的存储过程--通用版
- 存储过程 实现表中数据分页显示
- [源代码]千万级数据分页存储过程示例!
- SQL大数据查询分页存储过程