【问题标题】:Temporary table resource limit临时表资源限制
【发布时间】:2009-04-15 14:02:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: delphi bde midas-server


    【解决方案1】:

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

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

    【讨论】:

    • 是的,它是 tquery,但有 30 万条记录,不幸的是我无法从 BDE 迁移(这是一个古老而大的项目),我无法迁移到“更好”的数据库(它是 oracle :) )
    【解决方案2】:

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

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

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

    【讨论】:

    • 错误不在 TClientDataSet - 它是 BDE 错误,所以它是 TQuery,并且有 300K 记录。
    【解决方案3】:

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

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

    编辑

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

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

    【讨论】:

      【解决方案4】:

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

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

      祝你好运

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-08
        • 2011-09-27
        • 1970-01-01
        • 1970-01-01
        • 2020-10-11
        • 1970-01-01
        相关资源
        最近更新 更多