页面要加载几十万条数据,打开时特别慢,怎么办?
我的页面要加载几十万条数据,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




