临时表资源限制

时间:2009-04-15 14:02:40

标签: delphi bde midas-server

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

有没有解决方法如何解决这个问题? (“不要打开如此庞大的数据集”?)

更新:oops我很抱歉有300K记录,而不是3百万..

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

超过300万条记录太多,无法立即处理。我的猜测是你正在执行导出或类似的东西,这需要许多记录发送到网上。可以用来减少此问题的一种方法是让中间层生成导出文件,然后将该文件传递给客户端(最好先使用ZLIB或类似的东西进行压缩)。

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

修改

即使是300,000条记录也无法立即处理。如果你有那么多便士,你能把它们全部带走吗?但如果你把它变成更大的面额,你可以。如果您向客户端发送数据以进行报告,那么我强烈建议使用摘要方法...给他们大图并让他们慢慢钻进数据。发送分组数据,然后让它们慢慢打开。

如果这是搜索结果屏幕,则设置要返回的记录数限制+ 1.例如,要显示100条记录,请将限制设置为101.仍然只显示100,最后一条记录表示存在超过100条记录,因此客户需要调整其搜索条件以返回较小的子集。

答案 3 :(得分:0)

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

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

好运