TechWeb-技术社区's Archiver
TechWeb-技术社区 » 程序开发 » .NET » 如何提升大数据量页面的加载速度?
发表于 2008-4-3 12:09
我觉得客户无非就是要有一个良好的体验,既然有这样的要求,用Ajax就是较好的选择,这样就不会让界面堵死在那里,至于javascript的执行效率问题,相对于对数据库的查询时间来说,可以忽略。
发表于 2008-4-3 12:09
1.最好是写存储过程和索引
dY8O+|:P3`9? 2.全部一次性装载,放入缓存,只显示前n条,有事件触发,再载入下n条 M1gm1^4Wj
3.等待提示,友好性
发表于 2008-4-3 12:09
对于table有
j9M`w8bN3Z5VJ thead,tbody,tfoot这些个标签。table是数据加载完后整体显示的,用上tbody后就不一样了,它将会从上到下,一个一个tbody块来显示的,tbody可以有多个,其他两个最多只能有一个。
发表于 2008-4-3 12:09
10K行的话,如果页面又比较复杂,基本上ie会挂掉,别想追求性能了。
T8M)Q2l;~ ]-X 难道他以为ie可以当作SQL server用?
发表于 2008-4-3 12:10
1w行,估计是难为人吧!
发表于 2008-4-3 12:10
客户很洋很强大:((((
发表于 2008-4-3 12:10
很难想象10k行 不分页如何去看...
A~!~-_`-C RJQ
!B;Sk.D}/nhw P 其实你给客户呈现1万行,他也未必能都用上吧。
:h;N"DY1P*m8M
ftB-E&CQ4y 还是想办法按需呈现才好
发表于 2008-4-3 12:10
PS:没想到在这里能碰上jspadmin,很意外。
发表于 2008-4-3 12:10
一万行数据,就算用最简单的DIV+CSS,生成的HTML代码也要3M~5M吧,也就是说相当于下载一首MP3了,如果不用异步读取数据,只能一次性从服务器将这首Mp3下载下来,也就是说,只能靠服务器性能和网络传输速度了,很难很无奈 !i;] @H8t'z2zYgG|
1x)ucKw:UJA? 所以Ajax的确是个很不错的选择
9b8Z+AQm8x 2p7Ki9{8_0MJ
方案一:写一个分页存储过程,载入页面后,算好行数及页数,将10000行数据同时进行10~20个页数的异步读取,也就相当于多线程下载.
wGIzplM o ,~`Y)z3J$ao%o
方案二:如楼主所说,利用滚动条动作window.onscroll,计算应该显示的行数,动态调用Ajax去取得当前页面应该显示的数据 4Qt"w)Z3[/~:n
T&bPQX1Vo$gw
楼主可以比较一下两种方案的效率及实现难度再进行决择!
发表于 2008-4-3 12:10
估计客户的网络速度挺快的!
发表于 2008-4-3 12:10
无用功能,改一下:用户点击报表后,直接提示:“系统正在导出excel文件,需要花费一定时间” 给他倒个excel就可以了。剩下的交给客户对10k条数据 进行分析。否则谁有空 拖滚动条浏览10k条记录?
发表于 2008-4-3 12:10
BT的需求总会有的,就象有些需求是无聊的一样.但却给技术实现提出挑战. {3ZVq(@ wm
我最近也在琢磨一个大表的显示,但还没有BT到10K行.以下是我的实现思路,不知能否对楼主起点作用? A&?T3`Kf)pv(y
lMRo�k6NIC Javascript+DHTML: 0n$o�Z&qHFBN
&LRe'V#OIi F]nE 1,将表格中内容生成为Array数据;
{4]p,T&n0n%N o(RL` 2,建立表格对象,将Array数据分布在表格中;
rf.H.iC_)h 3,尽量用table的属性来风格化表格,不要用CSS;
W?!Na*uK:~ 4,也许用户还有更BT的打印需求,用其它方式可能不能满足;
+_?Kdk{ 0^8T1u3xM1bO!t
/a;[-rn#U.K4b9j&B 告诉用户,10K行数据,不是1K行数据,总要花些时间的.将电脑的所有优势都挖掘出来还不能解决问题的话,只有从改善硬件上来想办法了.
.x#P!L_ ~:j+g$g
Yw%D(VZ�I-L 一头牛拉再轻的车也不会象飞一样, 除非你会吹! ^-^
发表于 2008-4-3 12:10
此法可行 比如当前有8000条记录 约占有8000行 只在滚动条当前所在的屏幕区显示指定的一定数据量(如100条) 其它只是900行回车符" " 如果拖动鼠标后没有超过此100条的区域就正常显示 否则再重新通过ajax调用输出 取数据用分页存储过程其实是分页存储过程的变相实现 (即共有记录8000条 每页100条记录 共80页 由滚动条位置判断当前页) 当然这个"当前页"的判断要麻烦点表头和表尾部分处理费事些 但花些时间能够实现
发表于 2008-4-3 12:10
我记得好像在起点碰到过这个功能。 yAa!Z\ z
在阅读当前小说得时候有个 阅读全部的按钮。
K:];t0~N 应该是一样的功能
发表于 2008-4-3 12:10
这种用法是最快的:
z y_0?/C
Z7e�V5GB YX 1. #y7H%e yX3k
在工程中添加一个这个文件BaoBiaoHandler.ashx; Ft*S1_8a'V
然后把按钮的链接指向这个文件;在这个文件中你就可以随便的写了;这个文件之所以快的原因是因为它本身就是一个http处理程序,并且它不要状态保存等一些操作,是一个直接执行的文件,类似于java中的serlvet文件。 cD N*sc
*x�\H0H~k3fy 它的写法和普通的cs文件没什么区别;一样的。
.N(bwmQ'y0i
&qU}5cl 你要生成报表 %aHT^io3Orb
context.Response.ContentType = "image/jpeg";这个属性是必须; [H2XW{Hv D
FileStream fs = File.Open(context.Request.PhysicalApplicationPath + "d6dd57088b97b79e0b7b821e.gif", FileMode.Open);
#c%rB;u:m.Z R9ESela;e6{5B
byte[] fsBuffer = new byte[fs.Length]; H[:CH`t:F#or7\
int i = fs.Read(fsBuffer, 0, fsBuffer.Length); lxX-~[gA7~Gqkk
fs.Close(); ,AH#Eo-]veSz
K8zg1mq$r
context.Response.WriteFile(context.Request.PhysicalApplicationPath + "d6dd57088b97b79e0b7b821e.gif"); //.BinaryWrite(fsBuffer); //.OutputStream.Write(fsBuffer, 0, count);
+H1U!~4SP O9V%X(~ context.Response.Flush(); p~&N/Q2ZBD
这个是生成一个图片;你可以修改成你的需要。
HC/~.D#Sa%fB
w ^,qOY(`7N 2. }]6G8k%y:P~
你也可以这样,写一个cs文件继承自IHttpHandler接口,实现一个自己的Http处理程序,
MN6K3f9Tw�sieoxu public class Httphandler : IHttpHandler k~2{;[9O-y
{ }5j/HJN&r
public Httphandler()
B9a/O:}p3|oEJ4TO4? {
&?6CD-T;KOY;f;s
1u|G'|~1Q!? } (N[*hM5BEAS%G%m
-M1z\{8dh
#region IHttpHandler 成员 Sx PJ;[u(|$KE
Uetv1o bool IHttpHandler.IsReusable
;k)Vh[RK9Z R {
e&fH9H*dg:PX get { return true; }
a�LrpB| }
9VIhD�J ~ 0DO5J(v~K!XU
void IHttpHandler.ProcessRequest(HttpContext context) b'@ty"X-ra9Yd|;w
{ V)T&~Z\#s(XD3Z,H,xm
G5M%rSS~@ 5BiGXG5W
System.Data.SqlClient.SqlDataAdapter adp = new System.Data.SqlClient.SqlDataAdapter(SqlString,Conn);
1a0G7zwL`L DataSet ds = new DataSet(); ? I-X[W(m0G
adp.Fill(ds); b g;w%Z!D`jU
DataGrid dg = new DataGrid(); 9s }fW9O5z8P
dg.DataSource = ds.Tables[0]; 0g\)P4e E1z.Ol
dg.DataBind(); y p"{.}NH W
StringWriter sw=new StringWriter (); 't�H&rfS R-p
HtmlTextWriter htw=new HtmlTextWriter (sw); 2Bf8S5} zd
dg .RenderControl (htw); a;@}L(`wl)w
string html = sw.ToString();
f9KH&f? context.Response.Write(html);
(n0Hj s7Fbh } f%N2AN&~a)n_ N7p
Q�jKf5l9[8i #endregion
@B~F.t U } 9y a@$spe
} wmD^#wg(e
也可以,然后你要在web.config文件中注册以下这个
M b1k.ig1~ 6_[z ]a:M
//这个cs文件放在App_Code中
7K H!M g)RoNj y+PZ)`GR,~iH{2a
然后再IIS中添加一个isapi映射,对这个sqlx的请求都会使用这个类来返回了,非常快;
_T*_kj#Ys$d 扩展名可以随便定义的
发表于 2008-4-3 12:11
不考虑前后台种种优化,不用分页,如何实现 一点击报表加载按钮,报表逐(n)行显示出来?有没有好的解决方案?
FjsTL] ^E0ua ?x
2v3BQ&_-uaY*yu 你都把"好的解决方案"统统否决了. xuO c/v
.pc:ya!o1o9O8e�b 那就只能硬来了,你升级服务器,升级网络,升级客户机吧.
发表于 2008-4-3 12:11
这种数据量只能考虑数据库分页了
Zk(mSF9r\xt:k E 给你个提示,传入数据库页码和页面条数,数据库只返回相应条数的数据 koiJf
即传说中的后台分页,这样别管你数据nnnnk条,都很快。 Le+Xo&ACV
相应的控件网上有很多,开源的也有,可以自己看看。
发表于 2008-4-3 12:11
TechWeb-技术社区 » 程序开发 » .NET » 如何提升大数据量页面的加载速度?
发表于 2008-4-3 12:09
我觉得客户无非就是要有一个良好的体验,既然有这样的要求,用Ajax就是较好的选择,这样就不会让界面堵死在那里,至于javascript的执行效率问题,相对于对数据库的查询时间来说,可以忽略。
发表于 2008-4-3 12:09
1.最好是写存储过程和索引
dY8O+|:P3`9? 2.全部一次性装载,放入缓存,只显示前n条,有事件触发,再载入下n条 M1gm1^4Wj
3.等待提示,友好性
发表于 2008-4-3 12:09
对于table有
j9M`w8bN3Z5VJ thead,tbody,tfoot这些个标签。table是数据加载完后整体显示的,用上tbody后就不一样了,它将会从上到下,一个一个tbody块来显示的,tbody可以有多个,其他两个最多只能有一个。
发表于 2008-4-3 12:09
10K行的话,如果页面又比较复杂,基本上ie会挂掉,别想追求性能了。
T8M)Q2l;~ ]-X 难道他以为ie可以当作SQL server用?
发表于 2008-4-3 12:10
1w行,估计是难为人吧!
发表于 2008-4-3 12:10
客户很洋很强大:((((
发表于 2008-4-3 12:10
很难想象10k行 不分页如何去看...
A~!~-_`-C RJQ
!B;Sk.D}/nhw P 其实你给客户呈现1万行,他也未必能都用上吧。
:h;N"DY1P*m8M
ftB-E&CQ4y 还是想办法按需呈现才好
发表于 2008-4-3 12:10
PS:没想到在这里能碰上jspadmin,很意外。
发表于 2008-4-3 12:10
一万行数据,就算用最简单的DIV+CSS,生成的HTML代码也要3M~5M吧,也就是说相当于下载一首MP3了,如果不用异步读取数据,只能一次性从服务器将这首Mp3下载下来,也就是说,只能靠服务器性能和网络传输速度了,很难很无奈 !i;] @H8t'z2zYgG|
1x)ucKw:UJA? 所以Ajax的确是个很不错的选择
9b8Z+AQm8x 2p7Ki9{8_0MJ
方案一:写一个分页存储过程,载入页面后,算好行数及页数,将10000行数据同时进行10~20个页数的异步读取,也就相当于多线程下载.
wGIzplM o ,~`Y)z3J$ao%o
方案二:如楼主所说,利用滚动条动作window.onscroll,计算应该显示的行数,动态调用Ajax去取得当前页面应该显示的数据 4Qt"w)Z3[/~:n
T&bPQX1Vo$gw
楼主可以比较一下两种方案的效率及实现难度再进行决择!
发表于 2008-4-3 12:10
估计客户的网络速度挺快的!
发表于 2008-4-3 12:10
无用功能,改一下:用户点击报表后,直接提示:“系统正在导出excel文件,需要花费一定时间” 给他倒个excel就可以了。剩下的交给客户对10k条数据 进行分析。否则谁有空 拖滚动条浏览10k条记录?
发表于 2008-4-3 12:10
BT的需求总会有的,就象有些需求是无聊的一样.但却给技术实现提出挑战. {3ZVq(@ wm
我最近也在琢磨一个大表的显示,但还没有BT到10K行.以下是我的实现思路,不知能否对楼主起点作用? A&?T3`Kf)pv(y
lMRo�k6NIC Javascript+DHTML: 0n$o�Z&qHFBN
&LRe'V#OIi F]nE 1,将表格中内容生成为Array数据;
{4]p,T&n0n%N o(RL` 2,建立表格对象,将Array数据分布在表格中;
rf.H.iC_)h 3,尽量用table的属性来风格化表格,不要用CSS;
W?!Na*uK:~ 4,也许用户还有更BT的打印需求,用其它方式可能不能满足;
+_?Kdk{ 0^8T1u3xM1bO!t
/a;[-rn#U.K4b9j&B 告诉用户,10K行数据,不是1K行数据,总要花些时间的.将电脑的所有优势都挖掘出来还不能解决问题的话,只有从改善硬件上来想办法了.
.x#P!L_ ~:j+g$g
Yw%D(VZ�I-L 一头牛拉再轻的车也不会象飞一样, 除非你会吹! ^-^
发表于 2008-4-3 12:10
此法可行 比如当前有8000条记录 约占有8000行 只在滚动条当前所在的屏幕区显示指定的一定数据量(如100条) 其它只是900行回车符" " 如果拖动鼠标后没有超过此100条的区域就正常显示 否则再重新通过ajax调用输出 取数据用分页存储过程其实是分页存储过程的变相实现 (即共有记录8000条 每页100条记录 共80页 由滚动条位置判断当前页) 当然这个"当前页"的判断要麻烦点表头和表尾部分处理费事些 但花些时间能够实现
发表于 2008-4-3 12:10
我记得好像在起点碰到过这个功能。 yAa!Z\ z
在阅读当前小说得时候有个 阅读全部的按钮。
K:];t0~N 应该是一样的功能
发表于 2008-4-3 12:10
这种用法是最快的:
z y_0?/C
Z7e�V5GB YX 1. #y7H%e yX3k
在工程中添加一个这个文件BaoBiaoHandler.ashx; Ft*S1_8a'V
然后把按钮的链接指向这个文件;在这个文件中你就可以随便的写了;这个文件之所以快的原因是因为它本身就是一个http处理程序,并且它不要状态保存等一些操作,是一个直接执行的文件,类似于java中的serlvet文件。 cD N*sc
*x�\H0H~k3fy 它的写法和普通的cs文件没什么区别;一样的。
.N(bwmQ'y0i
&qU}5cl 你要生成报表 %aHT^io3Orb
context.Response.ContentType = "image/jpeg";这个属性是必须; [H2XW{Hv D
FileStream fs = File.Open(context.Request.PhysicalApplicationPath + "d6dd57088b97b79e0b7b821e.gif", FileMode.Open);
#c%rB;u:m.Z R9ESela;e6{5B
byte[] fsBuffer = new byte[fs.Length]; H[:CH`t:F#or7\
int i = fs.Read(fsBuffer, 0, fsBuffer.Length); lxX-~[gA7~Gqkk
fs.Close(); ,AH#Eo-]veSz
K8zg1mq$r
context.Response.WriteFile(context.Request.PhysicalApplicationPath + "d6dd57088b97b79e0b7b821e.gif"); //.BinaryWrite(fsBuffer); //.OutputStream.Write(fsBuffer, 0, count);
+H1U!~4SP O9V%X(~ context.Response.Flush(); p~&N/Q2ZBD
这个是生成一个图片;你可以修改成你的需要。
HC/~.D#Sa%fB
w ^,qOY(`7N 2. }]6G8k%y:P~
你也可以这样,写一个cs文件继承自IHttpHandler接口,实现一个自己的Http处理程序,
MN6K3f9Tw�sieoxu public class Httphandler : IHttpHandler k~2{;[9O-y
{ }5j/HJN&r
public Httphandler()
B9a/O:}p3|oEJ4TO4? {
&?6CD-T;KOY;f;s
1u|G'|~1Q!? } (N[*hM5BEAS%G%m
-M1z\{8dh
#region IHttpHandler 成员 Sx PJ;[u(|$KE
Uetv1o bool IHttpHandler.IsReusable
;k)Vh[RK9Z R {
e&fH9H*dg:PX get { return true; }
a�LrpB| }
9VIhD�J ~ 0DO5J(v~K!XU
void IHttpHandler.ProcessRequest(HttpContext context) b'@ty"X-ra9Yd|;w
{ V)T&~Z\#s(XD3Z,H,xm
G5M%rSS~@ 5BiGXG5W
System.Data.SqlClient.SqlDataAdapter adp = new System.Data.SqlClient.SqlDataAdapter(SqlString,Conn);
1a0G7zwL`L DataSet ds = new DataSet(); ? I-X[W(m0G
adp.Fill(ds); b g;w%Z!D`jU
DataGrid dg = new DataGrid(); 9s }fW9O5z8P
dg.DataSource = ds.Tables[0]; 0g\)P4e E1z.Ol
dg.DataBind(); y p"{.}NH W
StringWriter sw=new StringWriter (); 't�H&rfS R-p
HtmlTextWriter htw=new HtmlTextWriter (sw); 2Bf8S5} zd
dg .RenderControl (htw); a;@}L(`wl)w
string html = sw.ToString();
f9KH&f? context.Response.Write(html);
(n0Hj s7Fbh } f%N2AN&~a)n_ N7p
Q�jKf5l9[8i #endregion
@B~F.t U } 9y a@$spe
} wmD^#wg(e
也可以,然后你要在web.config文件中注册以下这个
M b1k.ig1~ 6_[z ]a:M
//这个cs文件放在App_Code中
7K H!M g)RoNj y+PZ)`GR,~iH{2a
然后再IIS中添加一个isapi映射,对这个sqlx的请求都会使用这个类来返回了,非常快;
_T*_kj#Ys$d 扩展名可以随便定义的
发表于 2008-4-3 12:11
不考虑前后台种种优化,不用分页,如何实现 一点击报表加载按钮,报表逐(n)行显示出来?有没有好的解决方案?
FjsTL] ^E0ua ?x
2v3BQ&_-uaY*yu 你都把"好的解决方案"统统否决了. xuO c/v
.pc:ya!o1o9O8e�b 那就只能硬来了,你升级服务器,升级网络,升级客户机吧.
发表于 2008-4-3 12:11
这种数据量只能考虑数据库分页了
Zk(mSF9r\xt:k E 给你个提示,传入数据库页码和页面条数,数据库只返回相应条数的数据 koiJf
即传说中的后台分页,这样别管你数据nnnnk条,都很快。 Le+Xo&ACV
相应的控件网上有很多,开源的也有,可以自己看看。
发表于 2008-4-3 12:11