gpt4 book ai didi

performance - TClientDataSet 在处理 100K+ 行时运行速度非常慢

转载 作者:行者123 更新时间:2023-12-03 15:02:37 25 4
gpt4 key购买 nike

我在使用 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;

以下代码在 3-4 分钟内返回相同数量的行(超过 180k)。

CDS 有什么问题吗?它比使用 ADO 慢大约 100 倍。可以修复吗?

最佳答案

Code above returns over 180k rows in 3-6 seconds when using pure ADO.

由于某些原因,我不希望您发布的代码返回 180k 记录中的每一条记录...我希望看到在调用 TADOQuery.Open 后加载第一个“X”记录,然后调用 TADOQuery.Last 时发送的最后“X”条记录。使用 while not EoF do 而不是“.Last”可能会是更好的性能测试,因为(我假设)您实际上想要浏览所有记录。

当链接到 DataProvider 时调用 TClientDataset.Last 时,它很可能对查询执行相当于 while not EoF do 的操作,从而传输所有 180k 记录。此外,TClientDataset 插入/追加操作往往会变得越来越慢,其中的记录越多。我最好的猜测是它必须时不时地重新分配内存缓冲区。如果是这样的话,我还没有找到一种方法来告诉 TClientDataset:“嘿!振作起来,有 180k 条记录传入!”(类似于 TList.SetCapacity)。

如果您有较旧版本的 delphi,可能会有所帮助的是 Midas Speed Fix .

关于performance - TClientDataSet 在处理 100K+ 行时运行速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27960191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com