0

我有两个应用程序(服务器和客户端),它们使用通过 TDCOMConnection 与 TClientDataSet 连接的 TQuery,在某些情况下,客户端数据集打开大约 300000 条记录,然后应用程序抛出异常“临时表资源限制”。

有什么解决方法可以解决这个问题吗?(除了“不要打开这么大的数据集”?)

更新:哎呀,对不起,有 300K 记录,而不是 300 万..

4

4 回答 4

3

错误可能来自 TQuery 而不是 TClientDataSet。使用 TQuery 时,它会创建一个临时表,您可能会遇到这个限制。然而,在这样说时,将 3,000,000 条记录加载到 TClientDataSet 中也是一个坏主意,因为它也会尝试将每条记录加载到内存中——如果它们每个只有几个字节,这可能是可能的,但它可能仍然会杀死你的机器(显然在每个 1kb 的情况下,您至少需要 3GB 的 RAM)。

您应该尝试将数据分成更小的块。如果是 TQuery 失败,这将意味着调整 SQL(更少的字段/更少的记录)或迁移到更好的数据库(毕竟 BDE 有点累了)。

于 2009-04-16T00:52:15.620 回答
2

你已经有了答案。不要在 ClientDataSet (CDS) 中打开如此庞大的数据集。

CDS 中的 300 万行是一个巨大的内存负载(取决于每行的大小,它可能是巨大的)。

使用 CDS 的全部目的是快速处理可在内存中操作的小型数据集。添加那么多行是荒谬的。改用真实的数据集,或者重新设计一些东西,这样您就不需要一次检索这么多行。

于 2009-04-15T15:25:51.270 回答
1

一次处理超过 300 万条记录实在是太多了。我的猜测是您正在执行导出或类似的操作,这需要通过网络发送许多记录。您可以用来减少此问题的一种方法是让中间层生成一个导出文件,然后将该文件交付给客户端(最好先使用 ZLIB 或类似的东西进行压缩)。

如果您将数据拉回客户端以供查看,请考虑仅发送摘要信息,然后允许客户端一次通过数据挖掘一部分。用户会感谢你,因为你的表现会大大提高,他们不必通过他们不关心的记录来挖掘。

编辑

即使是 300,000 条记录,一次处理也太多了。如果你有那么多便士,你能扛得住吗?但如果你把它变成更大的面额,你可以。如果您将数据发送给客户以获取报告,那么我强烈建议采用汇总方法……给他们一张大图,让他们慢慢钻研数据。发送分组数据,然后让它们慢慢打开。

如果这是一个搜索结果屏幕,那么设置返回记录数的限制+1。例如显示100条记录,设置限制为101。仍然只显示100条,最后一条记录意味着有MORE超过100 条记录,因此客户需要调整他们的搜索条件以返回较小的子集。

于 2009-04-15T15:51:36.730 回答
0

临时表资源限制不是单个查询的限制。它是所有打开查询的限制。所以它可能是您当时关闭所有其他查询的解决方案。

如果不能使用ADO连接,也可以设计一种分页机制,逐页查询数据。

祝你好运

于 2016-10-16T09:01:39.587 回答