我在使用 Delphi TClientDataSet检索数据时遇到问题
使用ADO编写代码:
ADOQuery1.SQL.Text:='SELECT * FROM Table1 WITH (NoLock)';
DataSource1.DataSet:=ADOQuery1;
DataSource1.DataSet.Open;
DataSource1.DataSet.Last;
使用纯ADO时,上面的代码在3-6秒内返回超过180 k行。
与TClientDataSet相同的代码:
ADOQuery1.SQL.Text:='SELECT * FROM Table1 WITH (NoLock)';
CDS1.SetProvider(ADOQuery1);
DataSource1.DataSet:=CDS1;
DataSource1.DataSet.Open;
DataSource1.DataSet.Last;
以下代码在3- 4分钟内返回相同数量的行(超过180 k)。
CDS有什么问题吗?它比使用ADO慢100倍。有可能修复它吗?
4条答案
按热度按时间vxbzzdmp1#
使用纯ADO时,上面的代码在3-6秒内返回超过180 k行。
由于某些原因,我不希望您发布的代码返回180 k条记录中的每一条......我希望看到在调用TADOQuery.Open后加载的前“X”条记录,然后在调用TADOQuery.Last时发送最后“X”条记录。使用
while not EoF do
而不是“.Last”可能是更好的性能测试,因为(我假设)您实际上希望浏览所有记录。当调用TClientDataset.Last时,当链接到DataProvider时,它很可能在您的查询上执行相当于
while not EoF do
的操作,这将传输所有的180 k条记录。而且,TClientDatasetInsert/Append操作往往会变得越来越慢,其中的记录越多。我最好的猜测是,它必须不时地重新分配它的内存缓冲区。如果是这样的话,我还没有找到一种方法来告诉TClientDataset:“嘿!做好准备,有180 k记录传入!"(类似于TList.SetCapacity)。如果你有一个旧版本的 Delphi ,Midas Speed Fix可能会有帮助。
igsr9ssn2#
这是相当老的,但现在有很多新的 Delphi 程序员在那里。这里有一点独家新闻。
当在 Delphi 中使用CDS时,你实际上是在创建一个内存表。你的查询可能会进入交换地狱。
要充分利用CDS,请使用DBX组件来获取数据。它们被称为“快进”游标,不会在数据库中创建带有游标的临时表。仅快进不会做ADO所做的那些花哨的事情。如果您需要具有全部更新通知和完全控制的大规模数据集,那么就使用ADO。如果您需要快速处理大量数据,而服务器上的负载很小,这正是CDS/DBX的优势所在。
DBX的方式更难,它只是一个dragster,First和Next是唯一对他们有效的东西,没有更新,没有承诺,只是一个快速的单向关系。2连接一个DBX/Provider/CDS组合,你就拥有了一切。3速度和编辑能力。4使用版本号来检测另一个用户在你编辑数据时对数据做了什么。5研究提供程序选项,看看如何灵活地获得强大的功能。这是非常硬的核心,因为它在 Delphi 。
agyaoht73#
CDS1.LogChanges属性= false或true这是相同的问题
qv7cva1a4#
加载数据之前,请尝试将CDS1.LogChanges属性设置为False.由于该属性不是已发布得属性,因此需要在代码中完成此操作.
从帮助文件:对于大型数据集,LogChanges的值为True可能会严重影响应用程序的性能。
然后,您可以在初始载入后将其打开。