zsx's Old Blog

黑历史逐步隐藏中_(:з」∠)_仅保留部分可能有些价值的文章,并不保证将来的可访问性。

ASP GetRows效率测试

老听有人说GetRows效率高,查了网上的文章也是这么说。于是我做了一个测试。

测试数据库:Access testmdb.rar

MSSQL(2012):

CREATE TABLE [a](
[ID] int identity (1,1) not null primary key,
[a] ntext default '',
[b] ntext default ''
)

批量写入20W条数据

Access使用VBS插入5W条数据:

Dim objConn,i,objRs
Set objConn = CreateObject("ADODB.Connection")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Website\IIS\getrows\testmdb.mdb"
Dim str
str="新华网达累斯萨拉姆3月25日电 中华人民共和国与坦桑尼亚联合共和国25日发表联合公报。联合公报全文如下:"&vbCrlf&"    中华人民共和国与坦桑尼亚联合共和国联合公报"&vbCrlf&"    一、应坦桑尼亚联合共和国总统贾卡亚·姆里绍·基奎特邀请,中华人民共和国主席习近平于2013年3月24日至25日对坦桑尼亚联合共和国进行国事访问。"&vbCrlf&"    二、访问期间,习近平主席同基奎特总统举行会谈。两国元首在亲切友好的气氛中就双边关系、落实中非合作论坛第五届部长级会议成果以及共同关心的地区和国际问题深入交换意见,达成广泛共识。双方签署了旨在加强中坦友好合作的多项协议。"&vbCrlf
str=str&"    三、双方高度评价中坦传统友谊,对建交以来中坦友好合作取得的丰硕成果表示满意。明年是中坦建交50周年,双方一致同意举行一系列庆祝活动。"&vbCrlf&"    四、双方认为进一步深化中坦关系符合两国和两国人民利益,一致同意构建和发展互利共赢的全面合作伙伴关系,不断增强政治互信,深化务实合作,增进人民友好,实现双方共同发展。"&vbCrlf&"    五、双方承诺在涉及国家主权、领土完整和稳定发展等核心利益问题上相互支持。中方支持坦为维护国家联合、民族团结和发展经济所作的努力。坦方重申坚持一个中国政策,支持中国政府为实现国家统一所作的一切努力。中方对坦方这一原则立场表示高度赞赏。"&vbCrlf&"    六、双方积极评价两国经贸合作成果,同意进一步加强贸易、投资、基础设施建设、农业、通讯、出口加工区开发等领域的合作。中国政府将继续为坦提供力所能及的帮助,推动有实力的中国企业赴坦投资,鼓励中国金融机构积极探讨为坦基础设施建设提供融资支持的可能性。"&vbCrlf
str=str&"    七、双方表示将进一步扩大人文交流,加强在教育、文化、科技、卫生、旅游、新闻等领域的交流与合作,密切青年、妇女、民间团体和学术机构的联系。中方将在坦设立一个中国文化中心。"&vbCrlf&"    八、双方同意进一步密切在国际事务中的合作,加强在联合国等多边场合的协调与配合,共同维护发展中国家权益。"&vbCrlf&"    九、中方高度评价基奎特总统领导的坦桑尼亚政府在国家建设中取得的显著成就,以及为维护非洲和平、稳定与发展作出的积极贡献。坦方感谢中方长期以来为坦经济社会发展提供的支持与帮助。"&vbCrlf
str=str&"    十、双方一致认为非洲是充满希望的大陆,也是维护世界和平稳定的重要力量。中方表示愿为促进非洲和平与发展事业发挥建设性作用。"&vbCrlf&"    十一、双方高度评价中非友好合作,赞赏中非合作论坛为推动中非关系发展所发挥的积极作用,一致同意紧密合作,全面落实中非合作论坛第五届部长级会议成果,推动中非新型战略伙伴关系不断深入发展。"&vbCrlf&"    十二、习近平主席在访问期间还会见了坦桑尼亚桑给巴尔民族团结政府总统阿里·穆罕默德·谢因和坦桑尼亚联合共和国前总统本杰明·威廉·姆卡帕。"&vbCrlf&"    十三、习近平主席于2013年3月25日在尼雷尔国际会议中心发表了题为《永远做可靠朋友和真诚伙伴》的演讲,全面阐述中国与非洲共谋和平、同促发展的对非政策。坦方对此给予高度评价。"&vbCrlf&"    十四、中方对习近平主席访问坦桑尼亚期间受到的热情友好接待表示衷心感谢。"&vbCrlf&"  二0一三年三月二十五日于达累斯萨拉姆"
Set objRs =CreateObject("ADODB.Recordset")
objRs.open "SELECT TOP 1 * FROM a",objConn,1,3
For i=1 To 50000
    objRs.AddNew()
    objRs("a")=i&str&i
    objRs("b")=i&"abcdefghijk"&i
    objRs.Update()
Next
Set objRs=Nothing
Set objConn=Nothing

MSSQL使用SSMS批量写入20W条数据

SET NOCOUNT ON;
DECLARE @i INT=1;
BEGIN TRANSACTION;
WHILE @i<=200000
BEGIN
INSERT INTO a (a, b) values(CAST(@i AS varchar(6))+'  新华网达累斯萨拉姆3月25日电 中华人民共和国与坦桑尼亚联合共和国25日发表联合公报。联合公报全文如下:
                                                                                                                                                                               
    中华人民共和国与坦桑尼亚联合共和国联合公报
                                                                                                                                                                               
    一、应坦桑尼亚联合共和国总统贾卡亚·姆里绍·基奎特邀请,中华人民共和国主席习近平于2013年3月24日至25日对坦桑尼亚联合共和国进行国事访问。
                                                                                                                                                                               
    二、访问期间,习近平主席同基奎特总统举行会谈。两国元首在亲切友好的气氛中就双边关系、落实中非合作论坛第五届部长级会议成果以及共同关心的地区和国际问题深入交换意见,达成广泛共识。双方签署了旨在加强中坦友好合作的多项协议。
                                                                                                                                                                               
    三、双方高度评价中坦传统友谊,对建交以来中坦友好合作取得的丰硕成果表示满意。明年是中坦建交50周年,双方一致同意举行一系列庆祝活动。
                                                                                                                                                                               
    四、双方认为进一步深化中坦关系符合两国和两国人民利益,一致同意构建和发展互利共赢的全面合作伙伴关系,不断增强政治互信,深化务实合作,增进人民友好,实现双方共同发展。
                                                                                                                                                                               
    五、双方承诺在涉及国家主权、领土完整和稳定发展等核心利益问题上相互支持。中方支持坦为维护国家联合、民族团结和发展经济所作的努力。坦方重申坚持一个中国政策,支持中国政府为实现国家统一所作的一切努力。中方对坦方这一原则立场表示高度赞赏。
                                                                                                                                                                               
    六、双方积极评价两国经贸合作成果,同意进一步加强贸易、投资、基础设施建设、农业、通讯、出口加工区开发等领域的合作。中国政府将继续为坦提供力所能及的帮助,推动有实力的中国企业赴坦投资,鼓励中国金融机构积极探讨为坦基础设施建设提供融资支持的可能性。
                                                                                                                                                                               
    七、双方表示将进一步扩大人文交流,加强在教育、文化、科技、卫生、旅游、新闻等领域的交流与合作,密切青年、妇女、民间团体和学术机构的联系。中方将在坦设立一个中国文化中心。
                                                                                                                                                                               
    八、双方同意进一步密切在国际事务中的合作,加强在联合国等多边场合的协调与配合,共同维护发展中国家权益。
                                                                                                                                                                               
    九、中方高度评价基奎特总统领导的坦桑尼亚政府在国家建设中取得的显著成就,以及为维护非洲和平、稳定与发展作出的积极贡献。坦方感谢中方长期以来为坦经济社会发展提供的支持与帮助。
                                                                                                                                                                               
    十、双方一致认为非洲是充满希望的大陆,也是维护世界和平稳定的重要力量。中方表示愿为促进非洲和平与发展事业发挥建设性作用。
                                                                                                                                                                               
    十一、双方高度评价中非友好合作,赞赏中非合作论坛为推动中非关系发展所发挥的积极作用,一致同意紧密合作,全面落实中非合作论坛第五届部长级会议成果,推动中非新型战略伙伴关系不断深入发展。
                                                                                                                                                                               
    十二、习近平主席在访问期间还会见了坦桑尼亚桑给巴尔民族团结政府总统阿里·穆罕默德·谢因和坦桑尼亚联合共和国前总统本杰明·威廉·姆卡帕。
                                                                                                                                                                               
    十三、习近平主席于2013年3月25日在尼雷尔国际会议中心发表了题为《永远做可靠朋友和真诚伙伴》的演讲,全面阐述中国与非洲共谋和平、同促发展的对非政策。坦方对此给予高度评价。
                                                                                                                                                                               
    十四、中方对习近平主席访问坦桑尼亚期间受到的热情友好接待表示衷心感谢。
                                                                                                                                                                               
    二0一三年三月二十五日于达累斯萨拉姆' + CAST(@i AS varchar(6)),'abcdefg
                                                                                                                                                                               
' + CAST(@i AS varchar(6)))
END
COMMIT

首先先用Access。

测试代码如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
Option Explicit
Dim objConn,i,objRs,StartTime,EndTime
Set objConn = CreateObject("ADODB.Connection")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Website\IIS\getrows\testmdb.mdb"
i=0
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>测试</title>
</head>
<body>
<%
Dim sTemp
%>
<p>循环取出全部数据:</p>
<%
StartTime = Timer()
Response.Flush
Set objRs=objConn.Execute("SELECT [a] FROM a")
Do Until objRs.Eof
    sTemp=objRs("a")
    objRs.MoveNext
Loop
Set objRs=Nothing
Response.Write "<p>用时:"&RunTime&"</p>"
%>
<p>GetRows:</p>
<%
Response.Flush()
StartTime = Timer()
objRs=objConn.Execute("SELECT [a] FROM a").GetRows
For i=0 To Ubound(objRs,2)
    sTemp=objRs(0,i)
Next
Response.Write "<p>用时:"&RunTime&"</p>"
%>
<%
Set objRs=Nothing
Set objConn=Nothing
%>
</p>
</body>
</html>
                                                                           
<%
Function RunTime()
                                                                           
    EndTime=Timer()
    RunTime = CLng(FormatNumber((EndTime-StartTime)*1000,3))
                                                                           
End Function
%>

三次测试结果如下

循环取出全部数据:

用时:1039

GetRows:

用时:953

循环取出全部数据:

用时:1047

GetRows:

用时:828

循环取出全部数据:

用时:1039

GetRows:

用时:922

可以看出,在只取出一列的情况下,5W条数据GetRows确实比Do Until快

取出全部呢?让我们把[a]换成*,objRs(0,i)换objRs(1,i)

三次测试结果如下

循环取出全部数据:

用时:938

GetRows:

用时:883

循环取出全部数据:

用时:1047

GetRows:

用时:922

循环取出全部数据:

用时:1055

GetRows:

用时:906

取出b列的情况下呢?

循环取出全部数据:

用时:570

GetRows:

用时:141

循环取出全部数据:

用时:500

GetRows:

用时:156

循环取出全部数据:

用时:398

GetRows:

用时:148

似乎GetRows总比循环快。


那,我们尝试一下一个38071条评论的ZBLOG数据库(数据库由卢松松提供,用以优化ZBLOG的评论部分的加载速度)吧(无视奇葩的最后一X,代码基本同上)

循环取出全部数据:

用时:516

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

GetRows:

用时:586

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

循环取出全部数据:

用时:547

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

GetRows:

用时:617

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

循环取出全部数据:

用时:547

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

GetRows:

用时:656

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

可以看到,GetRows反而还慢了。

稍微优化一下:由于测试只需要取出三列,故SQL语句改为

SELECT comm_Author,comm_PostTime,comm_Content FROM blog_Comment

结果如下:

循环取出全部数据:

用时:633

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

GetRows:

用时:312

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:2009/12/29 16:10:00

最后一人:卢松松

循环取出全部数据:

用时:617

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

GetRows:

用时:203

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:2009/12/29 16:10:00

最后一人:卢松松

循环取出全部数据:

用时:555

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

GetRows:

用时:180

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:2009/12/29 16:10:00

最后一人:卢松松


这说明了,GetRows在一次仅取出几列的情况下速度稍快,一旦同时取出的列过多速度就会变慢。这也许跟GetRows的工作方式有关。所以,用GetRows的情况下别用SELECT *!


MSSQL with 20w数据呢?

通过金山卫士我们可以看到,SQL进程与IIS进程正在进行大量的数据传输:

image

于是最后,循环取数据超时了:

Active Server Pages ���� 'ASP 0113'

�ű���ʱ

/getrows/getrows.asp

�����˽ű����е��ʱ�䡣����ͨ��Ϊ Server.ScriptTimeOut ����ָ����ֵ���� IIS ���������и�����Ӧֵ�����Ĵ����ơ�

GetRows呢?

我们依然可以看到大量的数据传输:

image

要是我的网速有这么快就好了,怨念

返回结果:

GetRows:

用时:103055

没有超时,不过也目测在边缘。。

SELECT TOP 10000 a FROM a呢?试试看。

循环取出全部数据:

用时:2375

GetRows:

用时:1133

循环取出全部数据:

用时:1305

GetRows:

用时:1047

循环取出全部数据:

用时:1289

GetRows:

用时:1102

50000呢?

循环取出全部数据:

用时:8203

GetRows:

用时:6000

循环取出全部数据:

用时:5945

GetRows:

用时:5422

循环取出全部数据:

用时:7234

GetRows:

用时:6523

那么,TOP b呢?

循环取出全部数据:

用时:625

GetRows:

用时:320

循环取出全部数据:

用时:547

GetRows:

用时:391

循环取出全部数据:

用时:609

GetRows:

用时:422

把那个Access转移到MSSQL呢?

SELECT comm_Author,comm_PostTime,comm_Content FROM blog_Comment——

循环取出全部数据:

用时:906

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

GetRows:

用时:648

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:2009/12/29 16:10:00

最后一人:卢松松

循环取出全部数据:

用时:742

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

GetRows:

用时:578

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:2009/12/29 16:10:00

最后一人:卢松松

循环取出全部数据:

用时:758

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

GetRows:

用时:547

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:2009/12/29 16:10:00

最后一人:卢松松

SELECT * FROM blog_Comment——

循环取出全部数据:

用时:1828

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

GetRows:

用时:1672

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

循环取出全部数据:

用时:2039

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

GetRows:

用时:1703

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

循环取出全部数据:

用时:1805

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00

GetRows:

用时:1695

最后一条:对,装了一个博客单页插件就可以搞定了

最后一个:卢松松

最后一人:2009/12/29 16:10:00




通过实验我们得出结论:

Access下,如果仅取出几列,则用GetRows效率高。如果取出的列过多,则用MoveNext游标效率高。

MSSQL下,数据过多时必须使用GetRows,数据量少、取出的列多时GetRows也比游标效率高。


控制面板
您好,欢迎到访网站!
  查看权限
Google Adsense
文章归档
站点信息
  • 文章总数:259
  • 页面总数:10
  • 分类总数:17
  • 标签总数:136
  • 评论总数:1644
  • 浏览总数:216659

Powered By Z-BlogPHP 1.5.1 Zero

闽ICP备15006942号   闽公网安备 35010302000147号