java - 使用java优化从数据库下载数据
问题描述
我们正在使用 java 从 oracle/mssql 数据库中下载大约 1000 万条数据。
我们一次获取 5000 条记录,获取 5000 条记录需要 5 分钟,具体取决于位置条件,因此获取和下载 1000 万条记录将需要 (1000 万/5000) *5 分钟,即 10000 分钟。
我们曾尝试一次获取 100000 条记录,但可能会遇到堆空间问题。
有什么办法可以优化吗?
解决方案
您将需要确定可以安全返回查询的记录数。您需要查看一条记录的平均大小,即 RecordSize,您需要确定 MaxSize。您可以通过这种方式加载的记录数是
最大尺寸/记录尺寸
但是您可能希望加载更少的记录,以避免记录平均比预期稍大的问题:
0.9 * MaxSize / RecordSize
此外,您需要优化查询以:
- 不加载不必要的列
- 使 where、have 和 on 子句更快
您可以将查询分为两步:首先使用真实条件运行查询并仅获取 id,然后仅使用 id 作为条件查询真实列。如果您碰巧使用连接来收集一些列,并且在收集 id 时不需要所有连接,这将特别有用。
此外,如果数据库未规范化,您可以通过对其进行规范化并索引您正在执行条件的列来改进您的数据库。但是,您需要小心索引,因为虽然它会加快读取速度,但会减慢写入速度。
推荐阅读
- java - Java FX TranslateTransition 持续时间更改
- android - 如何检测android上的屏幕亮度范围?
- javascript - node.js:如何将多个变量传递到视图中?
- libcurl - 如何使用 libcurl 实现 http 流式传输
- python - 函数 plt.show() 在 Spyder 中不起作用
- javascript - 文件加载弹出与功能一起出现,输入被隐藏
- centos - PHP 7.2 没有从易受攻击的 7.2.10 更新?
- python - 为什么我会收到“您的 SQL 语法有错误;” 尝试使用 pymysql 运行“状态”后出错?
- mongodb - 为什么mongo在这种情况下选择这个索引?
- ios - 将我的应用程序与社交媒体深度链接在 iOS 上是否仍然有效?