为什么Ado比BDE 慢许多

rockhard 2002-08-10 09:57:56
加精
TQuery和TADOQuery查询语句一模一样。但在显示数据时后者慢好多,有什么办法?而且发现用TQuery组件时DBGrid刷新快,一直有垂直滚动条,而用TADOQuery时刷新慢,且垂直滚动条有时有,有时没(视记录多少而定),还有就是DBGrid表格头也明显跟着刷新。


贴出代码:TADOQuery的:
char temp[15];
Query1->Close();
Query1->Parameters->ParamByName("sDate")->Value=Now()-20;
Query1->Parameters->ParamByName("lDate")->Value=Now()+1;
Query1->Parameters->ParamByName("deporcom")->Value="%";
if(TV->SelectionCount==0)
Query1->Parameters->ParamByName("GroupID")->Value="";
else
{
sprintf(temp,"%010d",(int)TV->Selected->Data);//TV为TTreeView树控件
Query1->Parameters->ParamByName("GroupID")->Value=temp;
}
Query1->Open();

////////////////////////////////////////////
TQuery的代码(与上几乎一模一样,就是多Prepare()

char temp[15];
Query1->Close();
Query1->ParamByName("sDate")->AsDateTime=FDTPicker->DateTime;
Query1->ParamByName("lDate")->AsDateTime=TDTPicker->DateTime;
Query1->ParamByName("deporcom")->AsString="%"+DepCBox->Text+"%";
if(TV->SelectionCount==0)
Query1->ParamByName("GroupID")->AsString="";
else
{
sprintf(temp,"%010d",(int)TV->Selected->Data);
Query1->ParamByName("GroupID")->AsString=temp;
}
Query1->Prepare();
Query1->Open();
...全文
72 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
rockhard 2002-08-14
  • 打赏
  • 举报
回复
谢谢bigwhiteshark(大白鲨&曾凡坤&曾牧暗鲨)
IT-司马青衫 2002-08-13
  • 打赏
  • 举报
回复
优化ADO的执行效率



下面是使用ADO时程序员应该知道的规则。只要程序员了解并且适当地使用
在应用系统中,那么让ADO和ADOExpress拥有良好的执行效率并不是困难的事情:

1) 尽量找到真正的原生ADO和OLE DB驱动程序。尽量不要使用ADO For ODBC驱动程序,
因为这种架构使用在一些数据库时会发生不正常的执行状况,也比原生ADO和OLE DB
驱动程序来得慢一些。
2) ADO驱动程序的品质大大地影响了应用系统的执行效率,因此,你应该为你的数据库找
一个良好的A D O驱动程序。
3) 尽量使用客户端的Cursor Location,并且只存取应用程序真正需要的数据到客户端,
使用少量、多次的方式存取数据。使用少量、多次的方式存取数据不管是对于主从架构
或分布式多层应用系统都是很好的方式。特别是对于Internet/Intranet和电子商务应用
系统来说,使用这种方式可以确保应用系统能够在许多用户同时使用的状况下仍然保有
合理的执行速度。
4) 适当设定CacheSize属性值。这是一个绝对不可忽略的设定,它的重要性仅次于
Cursor Location。虽然在前面讨论的内容中我们可以发现设定C a c h e S i z e接近
1000左右可以得到最好的效率/空间比,但是必须考虑当应用系统同时被许多用户
同时存取时,在一瞬间网络会传递的数据量有多大。因此你可能必须根据你的应
用系统的执行状况来适当地减少CacheSize为100 ~ 1000之间的数值。
5) 许多讨论如何优化A D O的文件都会建议使用存储过程,因为这些文件都假
设你只会使用MS SQL Server。但是不管使用什么数据库,如果可以的话,那么对
于需要处理大量数据的工作,使用存储过程绝对可以增加A D O应用程序的执行效
率。因为在这种情形下,存储过程可以让这些大量的数据不传递到客户端,而是
直接在数据库中处理数据,这可以避免造成网络严重的负荷。即使你不想使用存
储过程,因为你可能会使用不同的数据库,对于一些经常会执行的工作,至少也
应该使用Prepared ADO/ ADOExpress组件,这样也可以增加应用程序的执行效率。
6) 对于不会回传结果数据集的工作,例如使用Update、Delete等修改大量数据
的工作,可以考虑结合存储过程和A D O的异步执行模式。这样可以大大增加ADO
应用程序的执行效率以及减少ADO应用程序的反应时间。
7) ADO的Recordset对象,或ADOExpress的TADODataSet、TADOQuery和
TADOTable组件虽然都可以使用Select的SQL命令存取数据,并且让用户修改数据
再更新回数据源中。但是,如果你正在开发的ADO应用程序会执行大量的数据修
改的工作,那么你应该使用数个不同的TADODataSet、TADOQuery和TADOTable
组件。其中一个用来选取用户需要的数据,并且使用其他的TADODataSet,
TADOQuery和TADOTable组件来执行Update和Delete等的SQL命令,这样可以增加
ADO应用程序的执行效率。
8) 本项和第7项有关,即当你使用A D O开发分布式多层应用系统时,尽量设
定TDataSetProvider组件的Resolve To DataSet为True。让ADO本身来处理数据的修
改,而不要使用MIDAS的SQL Resolver,因为ADO可以更好地处理数据修改的数
据。但是请注意,由于ADOExpress目前有一个臭虫,因此在分布式多层应用系统
中不要使用TADODataSet、TADOQuery和TADOTable组件来执行Update和Delete
等的SQL命令。请直接使用执行Select SQL命令的TADODataSet、TADOQuery和
TADOTable组件来执行修改数据的工作。

9) 尽量使用Optimistic和BatchOptimistic这两种类型的LockType,因为它们不
但会降低系统锁定的资源,也可以增加A D O应用程序的执行效率。
10) ADO的Batch Update模式和DE/IDAPI的CacheUpdate非常类似,不管是
用在主从架构或Internet/Intranet及电子商务应用系统中都可以增加ADO应用程序
的执行效率。因此程序员应该尽量使用这种模式来开发A D O应用程序。
11) TADODataSet、TADOQuery和TADOTable组件的MarshalOptions控制了客
户端修改的数据如何传递回OLE DB Provider或数据源进行更新的工作。在分布式
多层应用系统和Internet/Intranet及电子商务应用系统中我们绝对不希望传递任何多
余的数据,以避免浪费网络资源。因此适当地设定MarshalOptions属性值为
moMarshalModifiedOnly也可以增加应用系统的执行效率。
12. 对于和图形用户接口有关的ADO应用程序,例如,如果需要在TDBGrid组
件中显示大量的数据,那么不要忘记我们早已熟知的技巧,暂时关闭数据感知组
件和A D O存取组件之间的关系,等待数据存取的工作完成之后再启动连接,那么
将可以大大增加图形用户接口响应用户的效率。这就是说,当应用程序要结合大
量数据存取和图形用户接口时,不要忘记调用Disable Controls和Enable Controls这
两个方法。
tofool 2002-08-12
  • 打赏
  • 举报
回复
那就是说: 要想速度快,最好用:BDE  哦!!
(大家都想速度快是不是 ?)

如果用BDE ,那么,在每台应用程序的PC上,不是要装BDE了 ??!!
天哪, 不会吧!! BDE都里可以载! 

rockhard 2002-08-12
  • 打赏
  • 举报
回复
是差了好多
CoderNO1 2002-08-12
  • 打赏
  • 举报
回复
>我做个一个测试,在sybase数据库里选择一条记录:
>bde:10毫秒;
>odbc:61毫秒;
>ado:510毫秒;
>相差好大哦!

真的那么严重吗?你试一试改一下ADOQuery的参数(建议使用ADO时,直接使用ADODataSet),如把CursorLocation设为clUseServer。在MSSQL上,读取10万条记录,基本感觉不出与BDE的差别的。
rockhard 2002-08-12
  • 打赏
  • 举报
回复
装BDE不麻烦,安装程序打包就行,我是觉得ADO不用配置数据源才用ADO,谁知道改了程序后才觉得慢。早知如此就不用这么麻烦了。还是第一次用ADO作数据库开发工作。一直用BDE的。
mochizuki 2002-08-11
  • 打赏
  • 举报
回复
不对,我用的是MSSQL,但感觉DBE比ADO快
rockhard 2002-08-11
  • 打赏
  • 举报
回复
楼上说得或许有道理,我用得是oracle 8.1.1.5

速度真是差得太明显了,只有几百条左右的数据,明显速度不一样,差近一秒左右。

我还是有意把bde改为ADO,为了不用打包ORACLE,没想到速度差这么多。

不知还没有别的改进办法。
jishiping 2002-08-11
  • 打赏
  • 举报
回复
BDE直接调用数据库的驱动程序(*.dll),所以比较快,而ODBC与ADO,还需要
在中间多加了一层驱动,所以就慢了。如果是BCB6.0,可以使用dbExpress,
它也是直接调用数据库的驱动程序,速度和BDE差不多吧。如果纪录稍微多一
点的话,比BDE还快。不过dbExpress的缺点是,目前它支持的数据库比较少,
以后会多起来的。
rockhard 2002-08-11
  • 打赏
  • 举报
回复
我也知道差了太多,问题是以前总是用BDE,现在一下子感觉慢了这么多,不知有没有什么办法提提速。
chenxz 2002-08-11
  • 打赏
  • 举报
回复
我做个一个测试,在sybase数据库里选择一条记录:
bde:10毫秒;
odbc:61毫秒;
ado:510毫秒;
相差好大哦!
SimonDW 2002-08-11
  • 打赏
  • 举报
回复
com组件,终归慢一些。
耙子 2002-08-10
  • 打赏
  • 举报
回复
BDE针对ADO目前的优势仅存在于 DBF, paradox 和oracle 8i了,
mssql的速度ado比BDE稍快,但是不该有你这么明显的差异。

如果你的表行很多,你尝试增大TADOQuery->CacheSize ,
变成100或者1000再看看。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧