为什么PreparedStatement比Statement快得多?

时间:2014-12-10 17:44:47

标签: java oracle jdbc

几天前,我不得不使用内存计算框架创建一些处理性能测试。所以为了做到这一点,我需要一个大数据池,在各种性能测试的基础上逐步增加。

数据库是Oracle,包含22个字段的表。该表需要逐步填充从1密耳记录到100密耳记录。

为了用1密耳填充表格,我生成了随机测试数据,并使用java语句将其插入到数据库中,并且已经花了 17和16秒分钟。在那之后,我很快意识到填充一个100密耳的记录表将需要永远,所以我尝试使用PreparedStatement,因为我知道它有点快......但差异是如此巨大, 1分24秒,我已经开始在网上搜索这背后的原因,并找出了一些原因,但在我看来,没有什么可以产生这种影响。

我发现这可能解释了这种差异: LINK

PreparedStatement得到预编译 在数据库中,访问计划也缓存在数据库中,这允许数据库使用预处理语句执行参数查询比正常查询快得多,因为它的工作量较少。您应该始终尝试在生产JDBC代码中使用PreparedStatement来减少数据库的负载。为了获得性能优势,值得注意的是只使用参数化版本的sql查询而不是字符串连接。

BUT 所有数据都是随机生成的,因此不应该涉及来自oracles方面的主要缓存。

1 个答案:

答案 0 :(得分:3)

Oracle可能会将查询计划缓存在语句缓存中;根据Oracle®数据库JDBC开发人员指南Implicit Statement Caching

  

启用隐式语句缓存时,JDBC会在您调用此语句对象的close方法时自动缓存预准备语句或可调用语句。准备好的和可调用的语句使用标准的连接对象和语句对象方法进行缓存和检索。

     

不会隐式缓存普通语句,因为隐式语句缓存使用SQL字符串作为键,而普通语句在没有SQL字符串的情况下创建。因此,隐式语句缓存仅适用于使用SQL字符串创建的OraclePreparedStatementOracleCallableStatement对象。