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

页面要加载几十万条数据,打开时特别慢,怎么办?

楼主chuihanwen()2006-11-01 17:13:00 在 .NET技术 / ASP.NET 提问

我的页面要加载几十万条数据,SQL   Server数据库,还没有上传,在本机调试的时候已经相当慢了,大概要半分钟,这样的话传到服务器上再加上网速限制那用户打开时不得奇慢无比啊?  
  请问大家这种问题应该如何解决? 问题点数:30、回复次数:50Top

1 楼yangye1211(杨杨)回复于 2006-11-01 17:18:57 得分 0

代码Top

2 楼dafeng168(我吾系二五仔)回复于 2006-11-01 17:22:51 得分 0

upTop

3 楼chuihanwen()回复于 2006-11-01 17:23:23 得分 0

代码相当简单了,就是把数据库中一个表的数据全部提到datagrid中,然后对datagrid进行分页:  
  string   str_sql="select   id,rz_name,r   from   rz_industry";  
  DataTable   dt_sql=new   DataTable   ();  
  dt_sql=Class.DataAccess.GetSqlData   (str_sql);  
  dg_News.DataSource   =dt_sql;  
  dg_News.DataBind   ();Top

4 楼wormwormwormworm(吃老板的嘴软,拿老板的手软)回复于 2006-11-01 17:24:08 得分 0

当然用分页处理了,十几万,你的机子受得了Top

5 楼lovelizheng(可可)回复于 2006-11-01 17:24:35 得分 0

写个存储过程吧.这样调用会快些.Top

6 楼yangye1211(杨杨)回复于 2006-11-01 17:35:25 得分 5

那么多页用户看得不累吗?  
  如果csdn所有的帖子都在一个栏目下面那怎么看?  
   
   
  第一直觉是数据库级分页   :     SELECT   TOP   @PageIndex   PERCENT   FROM   xxx  
  或者在逻辑层分页,DataTable[]    
  要么在表现层分页,Framework自动完成。Top

7 楼xyh2002(凌)回复于 2006-11-01 17:44:31 得分 0

使用存储过程的分页,可以在网上搜到很多例子的Top

8 楼Eddie005(♂) №.零零伍 (♂)回复于 2006-11-01 17:48:44 得分 5

参考一:  
   
  分页存储过程  
   
  ALTER   PROC   PageView  
  @tbname           sysname,                       --要分页显示的表名  
  @FieldKey       sysname,                       --用于定位记录的主键(惟一键)字段,只能是单个字段  
  @PageCurrent   int=1,                           --要显示的页码  
  @PageSize       int=10,                         --每页的大小(记录数)  
  @FieldShow     nvarchar(1000)='',     --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段  
  @FieldOrder     nvarchar(1000)='',   --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC  
                                                                                      --用于指定排序顺序  
  @Where           nvarchar(1000)='',     --查询条件  
  @PageCount     int   OUTPUT                 --总页数  
  AS  
  DECLARE   @sql   nvarchar(4000)  
  SET   NOCOUNT   ON  
  --检查对象是否有效  
  IF   OBJECT_ID(@tbname)   IS   NULL  
  BEGIN  
  RAISERROR(N'对象"%s"不存在',1,16,@tbname)  
  RETURN  
  END  
  IF   OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0  
  AND   OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0  
  AND   OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0  
  BEGIN  
  RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)  
  RETURN  
  END  
   
  --分页字段检查  
  IF   ISNULL(@FieldKey,N'')=''  
  BEGIN  
  RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)  
  RETURN  
  END  
   
  --其他参数检查及规范  
  IF   ISNULL(@PageCurrent,0)<1   SET   @PageCurrent=1  
  IF   ISNULL(@PageSize,0)<1   SET   @PageSize=10  
  IF   ISNULL(@FieldShow,N'')=N''   SET   @FieldShow=N'*'  
  IF   ISNULL(@FieldOrder,N'')=N''  
  SET   @FieldOrder=N''  
  ELSE  
  SET   @FieldOrder=N'ORDER   BY   '+LTRIM(@FieldOrder)  
  IF   ISNULL(@Where,N'')=N''  
  SET   @Where=N''  
  ELSE  
  SET   @Where=N'WHERE   ('+@Where+N')'  
   
  --如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)  
  IF   @PageCount   IS   NULL  
  BEGIN  
  SET   @sql=N'SELECT   @PageCount=COUNT(*)'  
  +N'   FROM   '+@tbname  
  +N'   '+@Where  
  EXEC   sp_executesql   @sql,N'@PageCount   int   OUTPUT',@PageCount   OUTPUT  
  SET   @PageCount=(@PageCount+@PageSize-1)/@PageSize  
  END  
   
  --计算分页显示的TOPN值  
  DECLARE   @TopN   varchar(20),@TopN1   varchar(20)  
  SELECT   @TopN=@PageSize,  
  @TopN1=@PageCurrent*@PageSize  
   
  --第一页直接显示  
  IF   @PageCurrent=1  
  EXEC(N'SELECT   TOP   '+@TopN  
  +N'   '+@FieldShow  
  +N'   FROM   '+@tbname  
  +N'   '+@Where  
  +N'   '+@FieldOrder)  
  ELSE  
  BEGIN  
  SELECT   @PageCurrent=@TopN1,  
  @sql=N'SELECT   @n=@n-1,@s=CASE   WHEN   @n<'+@TopN  
  +N'   THEN   @s+N'',''+QUOTENAME(RTRIM(CAST('+@FieldKey  
  +N'   as   varchar(8000))),N'''''''')   ELSE   N''''   END   FROM   '+@tbname  
  +N'   '+@Where  
  +N'   '+@FieldOrder  
  SET   ROWCOUNT   @PageCurrent  
  EXEC   sp_executesql   @sql,  
  N'@n   int,@s   nvarchar(4000)   OUTPUT',  
  @PageCurrent,@sql   OUTPUT  
  SET   ROWCOUNT   0  
  IF   @sql=N''  
  EXEC(N'SELECT   TOP   0'  
  +N'   '+@FieldShow  
  +N'   FROM   '+@tbname)  
  ELSE  
  BEGIN  
  SET   @sql=STUFF(@sql,1,1,N'')  
  --执行查询  
  EXEC(N'SELECT   TOP   '+@TopN  
  +N'   '+@FieldShow  
  +N'   FROM   '+@tbname  
  +N'   WHERE   '+@FieldKey  
  +N'   IN('+@sql  
  +N')   '+@FieldOrder)  
  END  
  ENDTop

9 楼Eddie005(♂) №.零零伍 (♂)回复于 2006-11-01 17:49:35 得分 0

参考二:  
   
  http://www.cnblogs.com/ilovejolly/archive/2006/10/10/523992.htmlTop

10 楼yangye1211(杨杨)回复于 2006-11-01 18:01:20 得分 0

SQL   Server传到IIS,几十万这个数量级也就是一个几百K的包,一般SQL   Server和IIS都在intranet里面,这点网络不成问题.  
  Top

11 楼junzhang4008(程序可以让尸体动起来)回复于 2006-11-01 18:44:25 得分 0

楼主的数据库关键查询字段上,设置索引了吗?  
   
  当数据量到达一定级别的时候,索引可以大大加快查询速度Top

12 楼luojianfeng(原来我不傻!)回复于 2006-11-02 08:35:58 得分 0

顶Top

13 楼xhmbldsh()回复于 2006-11-02 08:52:30 得分 0

使用分页的存储过程,因为datagrid   每次只绑定一页的数据Top

14 楼mostice(沉默的羔羊)回复于 2006-11-02 09:00:50 得分 0

标记一下  
  关注索引在大量数据中对查询速度的影响。Top

15 楼WDFrog(无敌青蛙)回复于 2006-11-02 09:03:54 得分 0

没搞错把,一次请求,加载十几万条,你是做什么东西?Top

16 楼sunjay117(悟空)回复于 2006-11-02 09:07:10 得分 0

分页是必要的Top

17 楼wuxingailni()回复于 2006-11-02 09:09:15 得分 0

用存储过程分页啦Top

18 楼l6098627(似水流年[哈有文章采集器:http://www.hayou.net.cn])回复于 2006-11-02 09:13:17 得分 0

什么功能一次要显示十万多条?给谁看?看得过来吗?用分页存储过程取数据吧Top

19 楼wangrumeng(逐梦)回复于 2006-11-02 09:16:08 得分 0

同意,就是使用分页存储过程,每次只拿出一页的数据,这种方法可以支持百万级数据的分页Top

20 楼hegang888888888(^_^)回复于 2006-11-02 09:16:44 得分 0

用存储过程分页Top

21 楼Hunts(唐朝栗子)回复于 2006-11-02 09:18:55 得分 0

mark  
  Top

22 楼hanguoji84(北飘)回复于 2006-11-02 09:20:00 得分 0

存储过程分页Top

23 楼huing(缥缈孤风)回复于 2006-11-02 09:28:53 得分 0

mark  
  Top

24 楼msf40906890(天涯枫)回复于 2006-11-02 09:46:03 得分 0

Eddie005(♂)   №.零零伍   (♂)   (   )   信誉:121    
  请问一下  
  IF   @PageCount   IS   NULL  
  BEGIN  
  SET   @sql=N'SELECT   @PageCount=COUNT(*)'  
  +N'   FROM   '+@tbname  
  +N'   '+@Where  
  EXEC   sp_executesql   @sql,N'@PageCount   int   OUTPUT',@PageCount   OUTPUT  
  SET   @PageCount=(@PageCount+@PageSize-1)/@PageSize  
  END  
   
  这段sql脚本里   N   是什么意思啊  
  Top

25 楼test33(隐姓埋名)回复于 2006-11-02 09:46:13 得分 0

路过学习了`Top

26 楼exiori(IORI)回复于 2006-11-02 09:47:08 得分 0

存储过程分页来处理.不通不知道你一次显示那么多有什么.看也看不过来.Top

27 楼wuluhua2003(人人为我,我为人人)回复于 2006-11-02 09:50:32 得分 5

你把数据一次头全部取过来当然慢了,自己写分页吧  
  sql语句你参考下啊  
  string   sql;  
                          int   EndNum   =   (CruntPage(当前页数)-1)   *   Pagesize(每页显示数);  
                          if   (EndNum   ==   0)  
                          {  
                                  sql   =   "select   top   {0}   *   from   OrderReview   order   by   OrderReviewID   desc";  
  sql   =   string.Format(sql,   Pagesize);  
                          }  
                          else  
                          {  
                                  sql   =   "select   top   {0}   *   from   OrderReview   where   OrderReviewID   not   in   (select   top   {1}   OrderReviewID   from   OrderReview   order   by   OrderReviewID   desc)   order   by   OrderReviewID   desc";  
                                  sql   =   string.Format(sql,   Pagesize,   EndNum);  
                          }Top

28 楼msf40906890(天涯枫)回复于 2006-11-02 10:00:17 得分 0

Eddie005(♂)   №.零零伍   (♂)   (   )   信誉:121    
  请问一下  
  IF   @PageCount   IS   NULL  
  BEGIN  
  SET   @sql=N'SELECT   @PageCount=COUNT(*)'  
  +N'   FROM   '+@tbname  
  +N'   '+@Where  
  EXEC   sp_executesql   @sql,N'@PageCount   int   OUTPUT',@PageCount   OUTPUT  
  SET   @PageCount=(@PageCount+@PageSize-1)/@PageSize  
  END  
   
  这段sql脚本里   N   是什么意思啊  
   
  有人回答一下么,是问题太弱还是大家都不知道啊,我在帮助里没有查到用法,但是把存储过程执行一下又没有报错,何解啊Top

29 楼lxhvc(lxhvc)回复于 2006-11-02 10:09:23 得分 5

N'   表示采用Unicode编码方式执行脚本,这样可以处理中文等非英文字符。  
  =========================  
    junzhang4008(程序可以让尸体动起来)      
     
        楼主的数据库关键查询字段上,设置索引了吗?  
   
  当数据量到达一定级别的时候,索引可以大大加快查询速度  
   
   
  全表查询,索引还有何用。楼主的程序设计上有问题,一来这么多数据用户无法看,二来服务器压力会很重。所以采用数据库分页是必须的。  
       
   
     
  Top

30 楼hotact(袋鼠)回复于 2006-11-02 10:18:17 得分 0

学习Top

31 楼yn098(绝梵)回复于 2006-11-02 11:17:48 得分 0

学习  
  Top

32 楼OrangeSeaCoast(橙色海岸)回复于 2006-11-02 11:22:15 得分 0

一次显示那么多条记录,你要给电脑看呀。人看脑子不乱了。Top

33 楼ye_zi(行到水穷处·坐看云起时)回复于 2006-11-02 11:27:19 得分 0

不用存储过程分页向楼主那样拖也拖死了,还打开呢Top

34 楼chuihanwen()回复于 2006-11-02 11:28:01 得分 0

谢谢大家!Top

35 楼OnlyVB(边城浪子)回复于 2006-11-02 11:41:28 得分 0

唉,.net在分页的功能上真是退化了,都把我搞蒙了,以前用asp的时候,可以分页读取数据库的记录,现在.net分页必须得靠什么破服务器端控件来分页,真不知道.net离开了控件能做什么,使用sql数据库还能用存储过程,使用access数据库怎么办呀?Top

36 楼aliketen(继续学习NET!)回复于 2006-11-02 11:53:13 得分 0

晕,这样肯定慢,想想都知道,用主键索引Top

37 楼skyrain19782004(天宇)回复于 2006-11-02 12:17:51 得分 0

没必要显示那么多吧!  
  我原来显示过8万条记录!在局域网里面访问都容易出现服务器超时。Top

38 楼dick78(vs2005+Ajax)回复于 2006-11-02 12:48:38 得分 0

大家都说完,顶吧.Top

39 楼Atwind(一线风)回复于 2006-11-02 12:52:40 得分 0

不服不行~  
  Top

40 楼zhongwanli(㊣【为了老婆,二次重构____然后升★★】㊣)回复于 2006-11-02 13:22:54 得分 0

Eddie005(♂)   №.零零伍   (♂)    
  --------  
  Top

41 楼yadier(一定要坚持CSDN的公益路线一百年不动摇)回复于 2006-11-02 13:36:49 得分 5

chuihanwen()   (   )   信誉:100         Blog     2006-11-01   17:23:00     得分:   0      
     
     
        代码相当简单了,就是把数据库中一个表的数据全部提到datagrid中,然后对datagrid进行分页:  
  string   str_sql="select   id,rz_name,r   from   rz_industry";  
  DataTable   dt_sql=new   DataTable   ();  
  dt_sql=Class.DataAccess.GetSqlData   (str_sql);  
  dg_News.DataSource   =dt_sql;  
  dg_News.DataBind   ();  
       
  -----------------  
  这个不对。这个分页无助于减少数据库压力。Top

42 楼venya(www.docxyz.com)回复于 2006-11-02 13:41:09 得分 0

在使用DataGrid、GridView这类控件时,不能过分依赖其自身的分页功能,尤其是在数据量比较大时。最好是需要显示哪一页,就提取这一页需要的数据,用三层嵌套sql语句就可以实现。Top

43 楼aliketen(继续学习NET!)回复于 2006-11-02 13:50:36 得分 5

来一个我搞SQL的分页吧,数度应该不错的  
  ///   <summary>  
  ///   高效获得一页数据[有条件]  
  ///   </summary>  
  ///   <param   name="PageSize">每页显示记录数</param>  
  ///   <param   name="PageNo">当前页码</param>  
  ///   <param   name="TableName">表名</param>  
  ///   <param   name="ClassTerm">分类条件</param>  
  ///   <param   name="OutPutItem">数据项</param>  
  ///   <param   name="MainKey">主键</param>  
  ///   <param   name="Preface">排序键</param>  
  ///   <returns></returns>  
  public   string     OnePageData(int   PageNo,int   PageSize,string   TableName,string   ClassTerm,string   OutPutItem,string   MainKey,string   Preface)  
  {  
  string[]   key   =   MainKey.Split('.');  
  string   _MainKey   =   string.Empty;  
  if(key.Length>1)  
  _MainKey   =   key[1];  
  else  
  _MainKey   =   MainKey;  
   
  string   strSql   =null;  
   
  if(PageNo==1)  
  {  
  strSql   =   "SELECT   Top   "+PageSize+"   "+OutPutItem+"   from   "+TableName+"   Where   "+ClassTerm+"   Order   By   "+MainKey+"   "+Preface;  
  }  
  else  
  {  
  if(Preface.ToLower()=="desc")  
  {  
  strSql   =   "SELECT   Top   "+PageSize+"   "+OutPutItem+"   FROM   "+TableName+"   WHERE";  
  strSql   =   strSql   +   "   ("+MainKey+"<(SELECT   MIN("+_MainKey+")   FROM   (SELECT   TOP   "+PageSize*(PageNo-1)+"   "+MainKey+"     FROM   "+TableName+"     Where   "+ClassTerm+"   ORDER       BY     "+MainKey+"   "+Preface+")       AS       T))";  
  strSql   =   strSql   +   "   And   "+ClassTerm;  
  strSql   =   strSql   +   "   ORDER     BY   "+MainKey+"   "+Preface;  
  }  
  else  
  {  
  strSql   =   "SELECT   Top   "+PageSize+"   "+OutPutItem+"   FROM   "+TableName+"   WHERE";  
  strSql   =   strSql   +   "   ("+MainKey+">(SELECT   MAX("+_MainKey+")   FROM   (SELECT   TOP   "+PageSize*(PageNo-1)+"   "+MainKey+"     FROM   "+TableName+"     Where   "+ClassTerm+"   ORDER       BY     "+MainKey+"   "+Preface+")       AS       T))";  
  strSql   =   strSql   +   "   And   "+ClassTerm;  
  strSql   =   strSql   +   "   ORDER     BY   "+MainKey+"   "+Preface;  
  }  
  }  
   
  return   strSql;  
  }Top

44 楼gb_boy(该昵称太帅_系统拒绝显示)回复于 2006-11-02 13:58:08 得分 0

markTop

45 楼zhbr(zbr)回复于 2006-11-02 14:00:22 得分 0

做个标记Top

46 楼huerreson(huerreson)回复于 2006-11-02 15:17:42 得分 0

markTop

47 楼kgdiwss(∮明天去要饭)回复于 2006-11-02 15:29:16 得分 0

别一下全读出来,几十万条就算全显示出来,谁要看啊。  
  一页几条就读几条啊。Top

48 楼zhangxu033()回复于 2006-11-02 15:31:53 得分 0

markTop

49 楼zzmsl(周先生)回复于 2006-11-02 15:42:39 得分 0

分页啊。管他一共多少条哦。就给他显式十几二十条哦。Top

50 楼mmlisa()回复于 2006-11-03 20:39:48 得分 0

 
  请关注难度问题,JavaScript打开应用程序  
   
  http://community.csdn.net/Expert/topic/5131/5131992.xml?temp=.2915003Top

相关问题

关键词

得分解答快速导航

  • 帖主:chuihanwen
  • yangye1211
  • Eddie005
  • wuluhua2003
  • lxhvc
  • yadier
  • aliketen

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

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