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

解决方案 »

  1.   

    代码相当简单了,就是把数据库中一个表的数据全部提到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 ();
      

  2.   

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

  3.   

    参考一:分页存储过程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
    END
      

  4.   

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

  5.   

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

  6.   

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

  7.   

    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 是什么意思啊
      

  8.   

    你把数据一次头全部取过来当然慢了,自己写分页吧
    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);
                }
      

  9.   

    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 是什么意思啊有人回答一下么,是问题太弱还是大家都不知道啊,我在帮助里没有查到用法,但是把存储过程执行一下又没有报错,何解啊
      

  10.   

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

  11.   

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

  12.   

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

  13.   

    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 ();
      
    -----------------
    这个不对。这个分页无助于减少数据库压力。
      

  14.   

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

  15.   

    来一个我搞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;
    }
      

  16.   


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