【发布时间】:2015-02-09 00:44:23
【问题描述】:
几天前,我不得不使用内存计算框架创建一些处理性能测试。因此,为了做到这一点,我需要一个大数据池,并根据各种性能测试逐步增加。
数据库是 Oracle,包含 22 个字段的表。该表需要从 100 万条记录逐渐填充到 1 亿条记录。
为了用 1 百万填充表,我生成了随机测试数据并使用 java 语句将其插入数据库,这大约花费了 17 和 16 秒分。在那之后,我很快意识到填充 1 亿条记录表需要很长时间,所以我用 PreparedStatement 进行了尝试,因为我知道这样会快一点……但差别太大了,1 分 24 秒,我已经开始在网上搜索这背后的原因,并找到了一些原因,但在我看来,没有任何原因会产生这种影响。
这就是我发现的可以解释这种差异的原因: LINK
PreparedStatement 被预编译 在数据库中,访问计划也缓存在数据库中,这允许数据库执行使用准备好的语句编写的参数查询比普通查询快得多,因为它要做的工作更少。您应该始终尝试在生产 JDBC 代码中使用 PreparedStatement 来减少数据库负载。为了获得性能优势,值得注意的是只使用参数化版本的 sql 查询,而不是字符串连接。
但是 所有数据都是随机生成的,因此不应该涉及来自 oracle 端的主要缓存。
【问题讨论】:
-
阅读有关 Oracle 硬解析和软解析以及 SGA 的信息。用于硬解析的未准备/文字版本的插入有很多处理周期。
-
我建议您在进行此类更改之前和之后跟踪程序。确保测试公平。然后分析生成的跟踪文件。结果往往令人惊讶。