CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  ASP

列表页读取大量数据库的问题?asp

楼主webcsdn(极限)2006-07-02 18:25:54 在 Web 开发 / ASP 提问

数据库:MSSQL  
  语言:asp  
  数据库有千万条数据,每个分类有百万条。  
  如何在asp列表页面读出来。  
   
  用普通的网页列表读取少量数据没问题。但读取以上数据时,程序反应不过来。  
   
  对读取大量数据库怎么样提高效率? 问题点数:50、回复次数:10Top

1 楼webcsdn(极限)回复于 2006-07-02 18:29:24 得分 0

部分代码:  
  ---------------------------  
   
   
  <%  
  set   rs=server.createobject("adodb.recordset")  
  sql="select     *   from   list   where   TypeID=22"  
  rs.open   sql,conn,1,1                              
  dim   page                                
  page=request("page")                                
  PageSize   =60                                                                                                                                
  rs.PageSize   =   PageSize          
  totalfilm=rs.recordcount          
  pgnum=rs.Pagecount            
                       
  if   page=""   or   clng(page)<1   then   page=1                                
  if   clng(page)   >   pgnum   then   page=pgnum                                
  if   pgnum>0   then   rs.AbsolutePage=page                                                    
  if   rs.eof   or   rs.bof   then                                
  response.write   "<tr><td   height=30   colspan=5>没有记录!</td></tr>"                                
  else  
                             
  do   while   not   rs.eof   and   count<rs.PageSize    
  %>  
   
   
  .....  
   
   
  <%  
  rs.movenext  
  loop    
  end   if  
  rs.close  
  ......  
  %>  
  Top

2 楼rqrq()回复于 2006-07-02 19:46:13 得分 0

存储过程分页,索引。  
  升级硬件。Top

3 楼webcsdn(极限)回复于 2006-07-03 00:43:14 得分 0

希望能详细一点,谢谢!Top

4 楼zz95469()回复于 2006-07-03 09:38:25 得分 0

普通的查询时将所有符合要求的记录读到内存中,你说的数据量那么大,当然一次堵进去系统都差不多死掉了,可以参考很多的利用数据库存储过程进行分业的技术,每次只读出一个叶面的数据,如20条数据,这样不会占用很多内存Top

5 楼daxuejianku(无言的悲伤)回复于 2006-07-03 09:47:34 得分 0

分页时按总条数分。当读取数据时。。。不是先读取所有数据后再分页。。而是只读出当前页面的记录。。。。。假如每页显示15条。。   那么我只读出页的15条。。此方法读取几十万数据不成问题。。  
  反应也蛮快`~  
  Top

6 楼TSD(智之选,商欲达--智商购物系统zhishop.com)回复于 2006-07-03 09:56:08 得分 0

用存储过程分页Top

7 楼rqrq()回复于 2006-09-26 21:42:30 得分 0

1.在TypeID建立索引  
  2.只SELECT需要的数据  
  3.用TOP分页  
  第一页:SELECT   TOP   20   id,   title   FROM   list   WHERE   typeid   =   22   ORDER   BY   id   DESC  
  页数大于1:SELECT   TOP   20   id,   title   FROM   list   WHERE   typeid   =   22   AND   id   <   (SELECT   MIN(SELECT   TOP   (page   -   1)   *   20   id   FROM   list   WHERE   typeid   =   22   ORDER   BY   id   DESC)   AS   tblTemp)   ORDER   BY   id   DESCTop

8 楼anwell(清风.Net 1982y.Net.Cn)回复于 2006-09-27 09:18:39 得分 0

晕,你这样读,再强的系统也崩溃.  
   
   
  给你一个存储过程分页的代码  
   
   
  if   exists   (select   *   from     sysobjects   where     id   =   object_id('NewsInfoPage')and   type   =   'P')  
        drop   procedure   NewsInfoPage  
  go  
   
  SET   QUOTED_IDENTIFIER   ON    
  GO  
  SET   ANSI_NULLS   ON    
  GO  
   
   
  CREATE   PROCEDURE   NewsInfoPage  
  @tblName   varchar(255),                                   --   表名    
  @strGetFields   varchar(1000)   =   '*',           --   需要返回的列    
  @fldName   varchar(255)='',                             --   排序的字段名    
  @PageSize   int   =   10,                                         --   页尺寸    
  @PageIndex   int   =   1,                                         --   页码    
  @doCount   bit   =   0,                                             --   返回记录总数,   非   0   值则返回    
  @OrderType   bit   =   0,                                         --   设置排序类型,   非   0   值则降序    
  @strWhere   varchar(1500)   =   ''                       --   查询条件   (注意:   不要加   where)    
  AS    
  declare   @strSQL   varchar(5000)                     --   主语句    
  declare   @strTmp   varchar(110)                       --   临时变量    
  declare   @strOrder   varchar(400)                   --   排序类型    
  if   @doCount   !=   0    
      begin    
      if   @strWhere   !=''    
            set   @strSQL   =   'select   count(*)   as   Total   from   ['   +   @tblName   +   ']   where   '+@strWhere    
      else    
            set   @strSQL   =   'select   count(*)   as   Total   from   ['   +   @tblName   +   ']'    
      end        
  --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况    
  else  
      begin    
      if   @OrderType   !=   0    
            begin  
            set   @strTmp   =   '<(select   min'    
            set   @strOrder   =   '   order   by   ['   +   @fldName   +']   desc'    
            --如果@OrderType不是0,就执行降序,这句很重要!    
      end  
  else    
      begin    
      set   @strTmp   =   '>(select   max'    
      set   @strOrder   =   '   order   by   ['   +   @fldName   +']   asc'    
  end    
   
  if   @PageIndex   =   1    
      begin    
      if   @strWhere   !=   ''        
            set   @strSQL   =   'select   top   '   +   str(@PageSize)   +'   '+@strGetFields+   '     from   ['   +   @tblName   +   ']   where   '   +   @strWhere   +   '   '   +   @strOrder    
      else    
            set   @strSQL   =   'select   top   '   +   str(@PageSize)   +'   '+@strGetFields+   '     from   ['+   @tblName   +   ']   '+   @strOrder    
      --如果是第一页就执行以上代码,这样会加快执行速度    
      end  
   
  else    
        begin    
        --以下代码赋予了@strSQL以真正执行的SQL代码    
        set   @strSQL   =   'select   top   '   +   str(@PageSize)   +'   '+@strGetFields+   '     from   ['    
        +   @tblName   +   ']   where   ['   +   @fldName   +   ']'   +   @strTmp   +   '(['+   @fldName   +   '])   from   (select   top   '   +   str((@PageIndex-1)*@PageSize)   +   '   ['+   @fldName   +   ']   from   ['   +   @tblName   +   ']'   +   @strOrder   +   ')   as   tblTmp)'+   @strOrder    
        if   @strWhere   !=   ''    
        set   @strSQL   =   'select   top   '   +   str(@PageSize)   +'   '+@strGetFields+   '     from   ['    
                  +   @tblName   +   ']   where   ['   +   @fldName   +   ']'   +   @strTmp   +   '(['    
                  +   @fldName   +   '])   from   (select   top   '   +   str((@PageIndex-1)*@PageSize)   +   '   ['    
                  +   @fldName   +   ']   from   ['   +   @tblName   +   ']   where   '   +   @strWhere   +   '   '    
                  +   @strOrder   +   ')   as   tblTmp)   and   '   +   @strWhere   +   '   '   +   @strOrder    
      end    
   
  end        
   
  exec   (@strSQL)    
   
   
  GO  
  SET   QUOTED_IDENTIFIER   OFF    
  GO  
  SET   ANSI_NULLS   ON    
  GO  
   
  Top

9 楼anwell(清风.Net 1982y.Net.Cn)回复于 2006-09-27 09:22:02 得分 0

用法:  
   
   
  Sql="exec   NewsInfoPage   tablename,   返回的列,   排序字段,   页尺寸,   页码,   返回记录总数,   非   0   值则返回   ,   设置排序类型,   非   0   值则降序,   查询条件   (注意:   不要加   where)   "  
  set   rs   =   conn.execute(sql)Top

10 楼POPO_POPO(○泡泡○)回复于 2006-09-27 09:31:06 得分 0

用存储过程来提高效率把!!!!!Top

相关问题

关键词

得分解答快速导航

  • 帖主:webcsdn

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo