2009-04-15 94 views
0

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

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

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

回答

2

您有答案了。不要在ClientDataSet(CDS)中打开如此巨大的数据集。

三百万行的CDS是一个巨大的内存负载(取决于每行的大小,也可以是巨大的)。

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

+0

错误 - 这是BDE的错误,所以它的TQuery和那里有300K记录。 – 2009-04-16 06:28:32

1

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

如果你拉的数据返回给客户端观看的目的,然后再考虑只发送汇总信息,然后允许客户端在同一时间挖thier方式通过数据的部分。用户会感谢你,因为你的表现会有所提高,他们不需要挖掘他们不关心的记录。

编辑

即使300,00条记录是太多处理一次。如果你有这么多便士,你会把它们全部带走吗?但是,如果你把它变成更大的教派,你可以。如果您将数据发送给客户以获得报告,那么我强烈建议使用总结方法......给他们一个大的图片,让他们慢慢钻入数据。发送分组数据,然后让他们慢慢打开。

如果这是一个搜索结果屏,然后设置要返回的记录数的限制+ 1。例如,显示100条记录,将限制设置为101仍然只显示100中,最后的记录是指有超过100条记录,所以客户需要调整他们的搜索条件以返回更小的子集。

3

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

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

+0

是的,它是tquery,但是300K的记录,不幸的是我不能从BDE移动(这是旧的和大的项目),我不能移动到“更好”的数据库(这是甲骨文:)) – 2009-04-16 06:32:16

0

临时表资源限制不是对单个查询的限制。这是所有打开的查询在一起的限制。因此它可能是您关闭所有其他查询的解决方案。

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

好运的TClientdataSet不