【问题标题】:Sql returning 3 million records and JVM outofmemory ExceptionSql 返回 300 万条记录和 JVM 内存不足异常
【发布时间】:2011-01-07 04:20:51
【问题描述】:

我正在通过 java 程序连接 oracle db。问题是我得到 Outofmemeory 异常,因为 sql 正在返回 300 万条记录。由于某种原因,我无法增加 JVM 堆大小。

解决这个问题的最佳解决方案是什么?

唯一的选择是使用 LIMIT 运行 sql 吗?

【问题讨论】:

  • 这是哪个数据库服务器,哪个 JDBC 驱动程序?
  • 您是如何“尝试”增加 jvm 堆大小的?某些原因不够明确。
  • 你想用 300 万条记录做什么?也许你可以使用一些 SQL Operators 在 DB 端做一些计算。
  • 1) 您真的需要 300 万条记录还是您的查询出现故障? 2)你的堆大小是多少? 3)拉300万条记录的目的是什么?

标签: java database optimization


【解决方案1】:

在我看来,返回 300 万条记录的查询毫无意义。你会对他们做什么?将它们呈现给用户没有任何意义,如果您想进行一些计算,最好运行多个查询,这些查询返回的记录要少得多。

使用 LIMIT 是一种解决方案,但更好的解决方案是重组您的数据库和应用程序,这样您就可以拥有不会一次性返回所有内容的“更智能”的查询。例如,您可以根据日期列返回记录。这样您就可以获得最新的。

【讨论】:

  • 返回 300 万条记录可能并非毫无意义。应用可能会出于某些报告和分析目的提取此类记录。
  • 如果您确实需要 300 万条记录,请以更小的块进行处理。
  • 是的,这是一种方式。我认为如果用户真的需要 300 万条记录,那么增加堆大小是他无法避免的。
【解决方案2】:

如果您的程序需要一次返回 300 万条记录,那么您做错了。需要一次处理 300 万条记录,您需要做什么?

您可以使用 LIMIT 将查询拆分为更小的查询,或者重新考虑需要做些什么来减少需要处理的数据量。

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      可能有三种可能的解决方案 1. 如果不需要一次检索 300 万条记录.. 使用 LIMIT

      1. 考虑使用有意义的where子句

      2. 使用 oracle 提供的工具将数据库条目导出为 txt 或 csv 或 excel 格式,并使用该文件供您使用..

      干杯:-)

      【讨论】:

        【解决方案5】:

        重新考虑你的 where 子句。看看你能不能让它更严格。 和/或 使用限制

        【讨论】:

          【解决方案6】:

          应用程序扩展始终是一个问题。这里的解决方案将在 Java 中作为 Oracle PL/SQL 中的存储过程执行您尝试执行的任何操作。让 oracle 处理数据并使用内部查询计划器来限制流入流出的数据量并可能导致严重的延迟。

          您甚至可以在Java 中编写存储过程。

          第二种解决方案是确实从几个 java 节点进行有限的查询和处理并整理结果。查找 map-reduce。

          【讨论】:

            【解决方案7】:

            仅供参考,在Oracle查询中,LIMITROWNUM

            例如,... WHERE ROWNUM<=1000

            【讨论】:

              【解决方案8】:

              如果每条记录大约 1 KB,这意味着 3GB 的数据,那么您的应用程序是否有这么多内存可用?

              如果你解释“真正的”问题应该会更好,因为 OutOfMemory 不是你的实际问题。

              【讨论】:

                【解决方案9】:

                如果您收到如此大的响应,请注意逐行处理结果集,以便完整的结果不需要存储在内存中。如果你做得好,你可以毫无问题地处理庞大的数据集。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-01-27
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-12-23
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多