Jax的大数据量分页

时间:2022-02-18 11:30:54

利用存储过程实现大数据量的分页。

创建人:理想国(http://www.utoper.com)--welsham;来源技术:Jax--理想国开发的技术框架 

还没有进行详细测试,一般测试的结果:普通机子,百万数据量,不会超过5秒;而网上的那存储过程分页,一般要10秒。

用pagingSQL.sql生成数据结构;在pagingSQL最后将添加一些原始数据,可设置@i的最大值,以决定添加的数据量,时间足够和硬盘足够,可设100万以上
执行paging.asp可查看结果。

http://dl2.csdn.net/down4/20070911/11110206823.rar

page.asp

 

Jax的大数据量分页<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
Jax的大数据量分页
<%
Jax的大数据量分页
'****************************************************************** 
Jax的大数据量分页'
** Jax的大数据量分页
Jax的大数据量分页'
** 创建人:理想国(http://www.utoper.com)--welsham;来源技术:Jax--理想国开发的技术框架
Jax的大数据量分页

Jax的大数据量分页
'** 数据表Uto_bkDoc,字段:docID(主键ID)、subject(标题)、content(内容),creator(创建人),creatorID(创建人ID),inTime(创建时间)
Jax的大数据量分页'
** 用pagingSQL.sql生成数据结构;在pagingSQL最后将添加一些原始数据,可设置@i的最大值,以决定添加的数据量,时间足够和硬盘足够,可设100万以上
Jax的大数据量分页

Jax的大数据量分页
'** 请把改进结果和测试结果发给我们:Utoper@163.com 或 welsham@163.com
Jax的大数据量分页'
******************************************************************
Jax的大数据量分页

Jax的大数据量分页
Dim rs,conn,connStr
Jax的大数据量分页
Dim pageSize,page,recordCount,query,order
Jax的大数据量分页
Dim time1
Jax的大数据量分页time1
=timer()
Jax的大数据量分页
'数据库配置
Jax的大数据量分页
connStr="Provider=SQLOLEDB.1;Persist Security Info=True;Data Source=localhost;uid=test;pwd=test2006;database=ASPNETMisDB;"
Jax的大数据量分页
Jax的大数据量分页
'初始化conn和rs
Jax的大数据量分页
Call initConn(conn)
Jax的大数据量分页
Call initRs(rs)
Jax的大数据量分页
Jax的大数据量分页
'演示:生成SQL及调用分页,建立rs
Jax的大数据量分页
pageSize=Request.QueryString("pageSize")
Jax的大数据量分页page
=Request.QueryString("page")
Jax的大数据量分页
Call getData(pageSize,page,query,order)
Jax的大数据量分页
'调用视力,显示数据
Jax的大数据量分页
Call view()
Jax的大数据量分页
Jax的大数据量分页
'清除conn和rs
Jax的大数据量分页
Call clearConn(conn)
Jax的大数据量分页
Call clearRs(rs)
Jax的大数据量分页
Jax的大数据量分页
Jax的大数据量分页
Function getData(pageSize,page,query,order)
Jax的大数据量分页    
Dim sqls(11),orders,UB,i
Jax的大数据量分页    
Dim top,docID,kw,creator,creatorID
Jax的大数据量分页    
Jax的大数据量分页    top
=getQuery(query,"top")
Jax的大数据量分页    
If top="" then top="0"
Jax的大数据量分页    
Jax的大数据量分页    docID
=getQuery(query,"docID")
Jax的大数据量分页    kw
=Trim(getQuery(query,"kw"))
Jax的大数据量分页    creator
=getQuery(query,"creator")
Jax的大数据量分页    creatorID
=getQuery(query,"creatorID")
Jax的大数据量分页    
'这是Jax的安全检测,防止SQL注入
Jax的大数据量分页
    'If Not oDoSafe.pFilter(Array(top,docID,kw,creator,creatorID),Array(12,21,21,21,12)) then Exit Function
Jax的大数据量分页
    
Jax的大数据量分页    sqls(
0)=CLng(top)
Jax的大数据量分页    sqls(
1)="d.docID,d.subject,d.creator,d.creatorID,d.inTime"        
Jax的大数据量分页    sqls(
2)="Uto_bkDoc As d"
Jax的大数据量分页    sqls(
3)=""
Jax的大数据量分页    
If docID<>"" then sqls(3)=sqls(3)&" and d.docID in("& docID &")"
Jax的大数据量分页    
If kw<>"" then sqls(3)=sqls(3)&" and d.kw Like '%"& kw &"'"
Jax的大数据量分页    
If creator<>"" then sqls(3)=sqls(3)&" and d.creator Like '%"& creator &"%'"
Jax的大数据量分页    
If creatorID<>"" then sqls(3)=sqls(3)&" and d.creatorID="& creatorID
Jax的大数据量分页    
If sqls(3)<>"" then sqls(3)="Where"&Mid(sqls(3),5)    
Jax的大数据量分页    
Jax的大数据量分页    sqls(
4)=""
Jax的大数据量分页    
Jax的大数据量分页    
If order="" then order="inTime_ASC"
Jax的大数据量分页    orders
=Split(order,"-")
Jax的大数据量分页    UB
=UBound(orders)
Jax的大数据量分页    sqls(
5)=""
Jax的大数据量分页    
For i=0 to UB
Jax的大数据量分页        orders(i)
=Split(orders(i),"_")
Jax的大数据量分页        
Select Case orders(i)(0)
Jax的大数据量分页            
Case "inTime"
Jax的大数据量分页                sqls(
5)=sqls(5)&",d."&orders(i)(0)&" "&orders(i)(1)
Jax的大数据量分页        
End Select
Jax的大数据量分页    
Next
Jax的大数据量分页    sqls(
5)="Order By "&Mid(sqls(5),2)
Jax的大数据量分页    sqls(
6)="d.docID"
Jax的大数据量分页    sqls(
7)="1"
Jax的大数据量分页    sqls(
8)=""
Jax的大数据量分页    sqls(
9)=""
Jax的大数据量分页    
If pageSize="" then    pageSize=25
Jax的大数据量分页    
If page="" then page=1
Jax的大数据量分页    sqls(
10)=CLng(pageSize)
Jax的大数据量分页    sqls(
11)=CLng(page)
Jax的大数据量分页
'调用
Jax的大数据量分页
    getData=getList(conn,rs,sqls)
Jax的大数据量分页
End Function
Jax的大数据量分页    
Jax的大数据量分页    
Jax的大数据量分页
'数据库操作
Jax的大数据量分页
Sub initConn(conn)
Jax的大数据量分页    
Set conn=Server.CreateObject("ADODB.Connection")
Jax的大数据量分页    conn.Mode
=3
Jax的大数据量分页    conn.open connStr
Jax的大数据量分页
End Sub
Jax的大数据量分页
Sub clearConn(conn)
Jax的大数据量分页    conn.Close
Jax的大数据量分页    
Set conn=nothing
Jax的大数据量分页
End Sub
Jax的大数据量分页
Sub initRs(rs)
Jax的大数据量分页    
Set rs=Server.CreateObject("ADODB.RecordSet")
Jax的大数据量分页
End Sub
Jax的大数据量分页
Sub clearRs(rs)
Jax的大数据量分页    
Set rs=nothing
Jax的大数据量分页
End Sub
Jax的大数据量分页
Jax的大数据量分页
Function getQuery(ByVal qUrl,qName)
Jax的大数据量分页    
Dim qStart,qEnd
Jax的大数据量分页    
If qUrl<>"" then
Jax的大数据量分页        qUrl
="&"&qUrl
Jax的大数据量分页        qStart
=InStr(qUrl,"&"&qName&"=")
Jax的大数据量分页        
If qStart>0 then
Jax的大数据量分页            qStart
=qStart+Len(qName)+2
Jax的大数据量分页            qEnd
=InStr(qStart,qUrl,"&")
Jax的大数据量分页            
If qEnd>=qStart then
Jax的大数据量分页                getQuery
=Mid(qUrl,qStart,qEnd-qStart)
Jax的大数据量分页            
else
Jax的大数据量分页                getQuery
=Mid(qUrl,qStart)
Jax的大数据量分页            
End if
Jax的大数据量分页        
else
Jax的大数据量分页            getQuery
=""
Jax的大数据量分页        
End if
Jax的大数据量分页    
else
Jax的大数据量分页        getQuery
=""
Jax的大数据量分页    
End if
Jax的大数据量分页
End Function
Jax的大数据量分页
Jax的大数据量分页
'分页调用
Jax的大数据量分页
Function getList(conn,rs,sqls)
Jax的大数据量分页    
'参数转化,预防错误    
Jax的大数据量分页
    sqls(10)=CLng(sqls(10))
Jax的大数据量分页    sqls(
11)=CLng(sqls(11))
Jax的大数据量分页    
Jax的大数据量分页    
'调用分页存储过程
Jax的大数据量分页
    set cmd=Server.CreateObject("ADODB.Command")
Jax的大数据量分页    
With cmd
Jax的大数据量分页        .ActiveConnection
=conn
Jax的大数据量分页        .CommandType
=4
Jax的大数据量分页        .CommandText
="Uto_paging"
Jax的大数据量分页        
Jax的大数据量分页        .Parameters.Append(cmd.CreateParameter(
"@pTop",3,1,,sqls(0))) 'select top的条数,0时表示所有
Jax的大数据量分页
        .Parameters.Append(cmd.CreateParameter("@pField",200,1,300,sqls(1))) '字段
Jax的大数据量分页
        .Parameters.Append(cmd.CreateParameter("@pTable",200,1,700,sqls(2))) '
Jax的大数据量分页
        .Parameters.Append(cmd.CreateParameter("@pWhere",200,1,650,sqls(3))) 'where
Jax的大数据量分页
        .Parameters.Append(cmd.CreateParameter("@pWhere2",200,1,650,sqls(4))) 'where2,二次查询筛选
Jax的大数据量分页
        .Parameters.Append(cmd.CreateParameter("@pOrder",200,1,100,sqls(5))) 'order等
Jax的大数据量分页
        .Parameters.Append(cmd.CreateParameter("@pID",200,1,25,sqls(6))) '主键
Jax的大数据量分页
        .Parameters.Append(cmd.CreateParameter("@pIDType",200,1,1,sqls(7))) '主键类型,1为int,2为char
Jax的大数据量分页
        .Parameters.Append(cmd.CreateParameter("@pStart",200,1,300,sqls(8))) '头部
Jax的大数据量分页
        .Parameters.Append(cmd.CreateParameter("@pEnd",200,1,1000,sqls(9))) '尾部
Jax的大数据量分页
        
Jax的大数据量分页        .Parameters.Append(cmd.CreateParameter(
"@page_size",3,1,,sqls(10))) '页大小
Jax的大数据量分页
        .Parameters.Append(cmd.CreateParameter("@page_no",3,1,,sqls(11))) '页码
Jax的大数据量分页
        .Parameters.Append(cmd.CreateParameter("@RecordCount",3,2)) '返回的记录数
Jax的大数据量分页
        .Execute()
Jax的大数据量分页        getList
=cmd.Parameters("@RecordCount")
Jax的大数据量分页        
set rs=cmd.Execute()
Jax的大数据量分页    
End With
Jax的大数据量分页    recordCount
=getList
Jax的大数据量分页    
Set cmd=nothing
Jax的大数据量分页
End Function
Jax的大数据量分页
Jax的大数据量分页
Sub view()
Jax的大数据量分页 %
>
Jax的大数据量分页
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Jax的大数据量分页
<html xmlns="http://www.w3.org/1999/xhtml">
Jax的大数据量分页
<head>
Jax的大数据量分页
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Jax的大数据量分页
<title>Jax的大数据量分页</title>
Jax的大数据量分页
</head>
Jax的大数据量分页
Jax的大数据量分页
<body>
Jax的大数据量分页
Jax的大数据量分页
<p>Jax的大数据量分页:</p>
Jax的大数据量分页
Jax的大数据量分页
<table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
Jax的大数据量分页  
<tr>
Jax的大数据量分页    
<td width="15%" height="25" align="center" bgcolor="#EFEFEF">ID</td>
Jax的大数据量分页    
<td width="23%" height="25" bgcolor="#EFEFEF">标题</td>
Jax的大数据量分页    
<td width="23%" height="25" align="center" bgcolor="#EFEFEF">创建人</td>
Jax的大数据量分页    
<td width="39%" height="25" align="center" bgcolor="#EFEFEF">创建时间</td>
Jax的大数据量分页  
</tr>
Jax的大数据量分页
<
Jax的大数据量分页
If recordCount=0 then
Jax的大数据量分页 %
>
Jax的大数据量分页 
<tr>
Jax的大数据量分页    
<td height="25" colspan="4" align="center" bgcolor="#FFFFFF">没有找到记录</td>
Jax的大数据量分页  
</tr>
Jax的大数据量分页
<
Jax的大数据量分页
else
Jax的大数据量分页    
Do While Not rs.EOF
Jax的大数据量分页 %
>
Jax的大数据量分页  
<tr>
Jax的大数据量分页    
<td height="25" align="center" bgcolor="#FFFFFF"><%= rs("docID") %></td>
Jax的大数据量分页    
<td height="25" bgcolor="#FFFFFF"><%= rs("subject") %></td>
Jax的大数据量分页    
<td height="25" align="center" bgcolor="#FFFFFF"><%= rs("creator") %></td>
Jax的大数据量分页    
<td height="25" align="center" bgcolor="#FFFFFF"><%= rs("inTime") %></td>
Jax的大数据量分页  
</tr>
Jax的大数据量分页
<
Jax的大数据量分页        rs.MoveNext
Jax的大数据量分页    
loop
Jax的大数据量分页    rs.Close
Jax的大数据量分页 %
>
Jax的大数据量分页  
<tr>
Jax的大数据量分页    
<td height="25" colspan="4" align="center" bgcolor="#EFEFEF">共有<%= recordCount %>条记录,当前第<%= page %>页,每页显示<%= pageSize %></td>
Jax的大数据量分页  
</tr>
Jax的大数据量分页  
Jax的大数据量分页
<
Jax的大数据量分页
End if
Jax的大数据量分页 %
>
Jax的大数据量分页 
Jax的大数据量分页
</table>
Jax的大数据量分页
Jax的大数据量分页
<p>运行时间:<%= (timer()-time1)*1000 %>ms</p>
Jax的大数据量分页
Jax的大数据量分页
</body>
Jax的大数据量分页
</html>
Jax的大数据量分页
<
Jax的大数据量分页
End Sub
Jax的大数据量分页 %
>

 

pagingSQL.sql

 

Jax的大数据量分页CREATE TABLE [Uto_bkDoc] (
Jax的大数据量分页    
[docID] [int] IDENTITY (11NOT NULL ,    
Jax的大数据量分页    
[subject] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,    
Jax的大数据量分页    
[content] [ntext] COLLATE Chinese_PRC_CI_AS NULL ,    
Jax的大数据量分页    
[creator] [nvarchar] (20NULL ,
Jax的大数据量分页    
[creatorID] [int] NULL ,
Jax的大数据量分页    
[inTime] [datetime] NULL ,    
Jax的大数据量分页
ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Jax的大数据量分页
Jax的大数据量分页
GO
Jax的大数据量分页
Jax的大数据量分页
Jax的大数据量分页
ALTER TABLE [Uto_bkDoc] ADD     
Jax的大数据量分页    
CONSTRAINT [DF_Uto_bkDoc_inTime] DEFAULT (getdate()) FOR [inTime],
Jax的大数据量分页    
CONSTRAINT [PK_UTO_BKDOC] PRIMARY KEY  NONCLUSTERED 
Jax的大数据量分页    (
Jax的大数据量分页        
[docID]
Jax的大数据量分页    )  
ON [PRIMARY] 
Jax的大数据量分页
GO
Jax的大数据量分页
Jax的大数据量分页
CREATE PROCEDURE Uto_paging
Jax的大数据量分页
@pTop int,@pField nvarchar(300),@pTable nvarchar(700),@pWhere nvarchar(650),@pWhere2 nvarchar(650),@pOrder nvarchar(100),@pID nvarchar(25),@pIDType nvarchar(1)
Jax的大数据量分页,
@pStart nvarchar(300),@pEnd nvarchar(1000),@page_size int,@page_no int,@RecordCount int output
Jax的大数据量分页 
AS
Jax的大数据量分页
Begin
Jax的大数据量分页    
Declare @sqlstr nvarchar(4000),@IDStr nvarchar(2200)
Jax的大数据量分页    
Declare @lower int,@upper int,@upper1 int
Jax的大数据量分页    
Set @lower=(@page_no-1)*@page_size
Jax的大数据量分页    
Set @upper=@lower+@page_size
Jax的大数据量分页    
Set @upper1=@upper+1
Jax的大数据量分页    
Jax的大数据量分页    
Set nocount on
Jax的大数据量分页    
Set @sqlstr=N'Set @i=0'+char(13)
Jax的大数据量分页    
Set @sqlstr=@sqlstr+N'Set @IDStr=N'''' '+char(13)
Jax的大数据量分页    
Set @sqlstr=@sqlstr+N'Select '
Jax的大数据量分页    
IF @pTop>0
Jax的大数据量分页        
Set @sqlstr=@sqlstr+N'Top '+Cast(@pTop As nvarchar(10))+N' '
Jax的大数据量分页    
Set @sqlstr=@sqlstr+N'@i=@i+1,@IDStr=Case when @i>'+Cast(@upper As nvarchar(10))+N' then @IDStr '
Jax的大数据量分页    
Set @sqlstr=@sqlstr+N'when @i>'+Cast(@lower As nvarchar(10))+N' and @i<'+Cast(@upper1 As nvarchar(10))+N' then @IDStr+'
Jax的大数据量分页    
IF @pIDType='1'
Jax的大数据量分页        
Set @sqlstr=@sqlstr+N'Cast('+@pID+N' As nvarchar(10))+'','' '
Jax的大数据量分页    
IF @pIDType='2'
Jax的大数据量分页        
Set @sqlstr=@sqlstr+@pID+N'+'','' '
Jax的大数据量分页    
Set @sqlstr=@sqlstr+N'else N'''' End '
Jax的大数据量分页    
Set @sqlstr=@sqlstr+N'From '+@pTable+N' '+@pWhere+N' '+@pOrder
Jax的大数据量分页    
EXECUTE sp_executesql @sqlstr,N'@i int output,@IDStr nvarchar(2200) output'@RecordCount output,@IDStr output
Jax的大数据量分页    
Jax的大数据量分页    
Set nocount off
Jax的大数据量分页    
IF Len(@IDStr)>0
Jax的大数据量分页        
Begin
Jax的大数据量分页            
Set @IDStr=Left(@IDStr,Len(@IDStr)-1)
Jax的大数据量分页            
IF @pIDType='2'
Jax的大数据量分页                
Set @IDStr=''''+Replace(@IDStr','''',''')+''''
Jax的大数据量分页            
Set @sqlstr='Select '+@pField+' From '+@pTable+' Where '+@pID+' in ('+@IDStr+')'
Jax的大数据量分页            
IF Len(@pWhere2)>0
Jax的大数据量分页                
Set @sqlstr=@sqlstr+' and '+@pWhere2
Jax的大数据量分页            
IF Len(@pStart)>0
Jax的大数据量分页                    
Set @sqlstr=@pStart+@sqlstr
Jax的大数据量分页            
IF Len(@pEnd)>0
Jax的大数据量分页                    
Set @sqlstr=@sqlstr+@pEnd
Jax的大数据量分页            
Else
Jax的大数据量分页                    
Set @sqlstr=@sqlstr+' '+@pOrder
Jax的大数据量分页        
End
Jax的大数据量分页    
else
Jax的大数据量分页        
Begin
Jax的大数据量分页            
Set @sqlstr='Select '+@pField+' From '+@pTable+' Where '+@pID+'='
Jax的大数据量分页            
IF @pIDType='1'
Jax的大数据量分页                
Set @sqlstr=@sqlstr+'-1'
Jax的大数据量分页            
Else
Jax的大数据量分页                
Set @sqlstr=@sqlstr+''''''
Jax的大数据量分页        
End
Jax的大数据量分页    
Exec(@sqlstr)
Jax的大数据量分页
End
Jax的大数据量分页
GO
Jax的大数据量分页
Jax的大数据量分页
Jax的大数据量分页
Jax的大数据量分页Jax的大数据量分页
/*
Jax的大数据量分页添加原始数据,可修改@i<3000的值,以决定测试的数据量
Jax的大数据量分页
*/

Jax的大数据量分页
Declare @i int
Jax的大数据量分页
Set @i=0
Jax的大数据量分页
While @i<100000
Jax的大数据量分页
BEGIN
Jax的大数据量分页    
Insert Into Uto_bkDoc(subject,creator) Values(''+Cast(@i As varchar(10)),'system')
Jax的大数据量分页    
Set @i=@i+1
Jax的大数据量分页
END
Jax的大数据量分页