我用ado访问远程服务器的sql server数据库的时候,发觉读取记录的速度特别慢,代码如下:
try{ starttime=GetTickCount ();
theApp .g_mdb.m_pRecordset ->Open (varSQL ,
theApp .g_mdb .m_pConnection .GetInterfacePtr (),
adOpenDynamic ,
adLockOptimistic ,
adCmdText );
while(!theApp .g_mdb.m_pRecordset->GetadoEOF())
{
theApp .g_mdb.m_pRecordset->MoveNext(); dwRecordcount +=1;
} }
catch(_com_error)
{
theApp .g_mdb.m_pRecordset ->Close ();
MessageBox ("程序出错,代码00002");
return FALSE ;
} usetime=GetTickCount() -starttime;访问的数据库的表里面大概只有3000条记录,而符合我查询条件的大概100条,每个记录只有一个字段,大概10个字符而已。但是完成整个查询大概需要6秒。我测试过,theApp .g_mdb.m_pRecordset ->Open 这一句之后所用的时间只是300ms,很快,就是说服务器的响应还算快。但是为什么后面的读取记录就需要那么多时间了。所以有以下几个问题:
1、m_pRecordset ->Open的操作是否只是打开数据库,在远程查询,而得到的结果记录还没有传到本地?
2、有什么办法提高查询的效率,能一次把记录集保存到本地数组吗?如果100条记录,每个记录10个字符,正常的完成时间是多少?
try{ starttime=GetTickCount ();
theApp .g_mdb.m_pRecordset ->Open (varSQL ,
theApp .g_mdb .m_pConnection .GetInterfacePtr (),
adOpenDynamic ,
adLockOptimistic ,
adCmdText );
while(!theApp .g_mdb.m_pRecordset->GetadoEOF())
{
theApp .g_mdb.m_pRecordset->MoveNext(); dwRecordcount +=1;
} }
catch(_com_error)
{
theApp .g_mdb.m_pRecordset ->Close ();
MessageBox ("程序出错,代码00002");
return FALSE ;
} usetime=GetTickCount() -starttime;访问的数据库的表里面大概只有3000条记录,而符合我查询条件的大概100条,每个记录只有一个字段,大概10个字符而已。但是完成整个查询大概需要6秒。我测试过,theApp .g_mdb.m_pRecordset ->Open 这一句之后所用的时间只是300ms,很快,就是说服务器的响应还算快。但是为什么后面的读取记录就需要那么多时间了。所以有以下几个问题:
1、m_pRecordset ->Open的操作是否只是打开数据库,在远程查询,而得到的结果记录还没有传到本地?
2、有什么办法提高查询的效率,能一次把记录集保存到本地数组吗?如果100条记录,每个记录10个字符,正常的完成时间是多少?
2,试试研究一下m_pRecordset的游标方式看看有没有什么改进。总共花了6秒,的确有些不正常。你应该先在服务器端,用查询分析器执行你的查询语句,看看速度如何,虽然你的记录数不错,但如果服务器异常繁忙,或者这个表频繁被锁,速度照样会慢的。然后就是确定你本地和服务器之间的网络状况,用ping就能看个大概了,如果ping值有1000,那慢就太正常了。
你把adOpenDynamic改成adOpenStatic或adOpenForwardOnly 试试