我在使用Delphi TClientDataSet检索数据时遇到问题。
使用ADO编写代码:
ADOQuery1.SQL.Text:='SELECT * FROM Table1 WITH (NoLock)';
DataSource1.DataSet:=ADOQuery1;
DataSource1.DataSet.Open;
DataSource1.DataSet.Last;当使用纯ADO时,上面的代码在3-6秒内返回超过180k行。
与TClientDataSet相同的代码:
ADOQuery1.SQL.Text:='SELECT * FROM Table1 WITH (NoLock)';
CDS1.SetProvider(ADOQuery1);
DataSource1.DataSet:=CDS1;
DataSource1.DataSet.Open;
DataSource1.DataSet.Last;下面的代码返回相同数量的行(超过180k),但在3-4分钟内。
CDS有什么问题?它比使用ADO慢100倍。有没有可能修复它?
发布于 2015-01-16 02:35:40
当使用纯
时,上面的代码在3-6秒内返回超过180k行。
出于某些原因,我不希望您发布的代码会返回180k记录中的每一条……我期望看到在调用TADOQuery.Open之后加载的第一个"X“记录,然后在调用TADOQuery.Last时发送的最后一个"X”记录。使用while not EoF do而不是".Last“可能是更好的性能测试,因为(我假设)您实际上想浏览所有记录。
当链接到DataProvider时调用TClientDataset.Last时,它很可能对您的查询执行等价于while not EoF do的操作,这将传输所有180k记录。此外,TClientDataset插入/追加操作往往会随着记录的增多而变得越来越慢。我最好的猜测是它必须时不时地重新分配它的内存缓冲区。如果是这样的话,我还没有找到一种方法来告诉TClientDataset:“嘿!振作起来,180k记录正在到来!”(Akin to TList.SetCapacity)。
如果你有一个老版本的delphi,有一件事可能会有帮助,那就是Midas Speed Fix。
发布于 2016-02-15 01:31:29
这是相当老的,但现在有很多新的Delphi程序员。这里有一点独家新闻。
在delphi中使用CDS时,实际上是在创建内存表。您的查询可能去了交换地狱。
要最大限度地利用CDS,请使用DBX组件来获取数据。它们被称为“快进”游标,不会在数据库中创建带有游标的临时表。forward only不会做ADO做的那些花哨的事情。如果您需要具有完全更新通知和完全控制的大型数据集,则使用ADO。如果您需要匆忙处理大量数据,而服务器上的负载又很少,这正是CDS/DBX的优势所在。
DBX的方法比较困难。它只是一个拖拉机。First和Next是唯一对他们有效的方法。没有更新,没有承诺,只有一个快速的单向关系。将DBX/provider/CDS组合挂接起来,您就拥有了一切。速度和编辑能力。使用版本号可以检测到其他用户在您编辑数据时对数据进行了某些操作。研究提供程序选项,以了解如何灵活地获得电力。这几乎和在Delphi中一样的核心。
发布于 2015-01-16 00:11:37
在加载数据之前,请尝试将CDS1.LogChanges属性设置为False。这需要在代码中完成,因为它不是已发布的属性。
来自帮助文件:对于大型数据集,LogChanges的True值可能会严重影响应用程序的性能。
然后,可以在初始加载后将其打开。
https://stackoverflow.com/questions/27960191
复制相似问题