准备好的语句更新 - 性能改进

Posted

技术标签:

【中文标题】准备好的语句更新 - 性能改进【英文标题】:Prepared statement update - performance improvement 【发布时间】:2013-03-12 06:05:44 【问题描述】:

我的应用程序中有一个 oracle 准备好的语句,它将一次性更新表中大约 100,000 条记录的状态。 例如:

UPDATE <TABLE NAME> SET STATUS=SUCCESS' where STATUS='INIT'

上述查询将一次更新大约 100,000 多条记录。 有什么方法可以提高性能,例如在准备好的语句上设置批处理/获取大小?如果我使用带有上述查询的准备好的语句,我将只执行一次,因为我没有设置任何参数来批量执行,我该怎么做?

【问题讨论】:

prepared statements 与大数据更新无关。它只是一种创建常规查询的方法。所以,这是一个查询必须是你关心的,而不是准备好的语句。 SQL 可以给你一些批处理的方法,但是你甚至没有提到你使用的是哪个 SQL。 十万单位在南亚以外是未知的,您可能想用 100,000 或 100000 替换它。 【参考方案1】:

一种优化方法是不要一次运行一个查询(因为每个查询的系统延迟太慢...)

您可以使用批量更新。

如果您使用的是 Spring,请使用 batchUpdate

或者如果您直接处理 JDBC,则使用

preparedStatement.addBatch(); 

preparedStatement.executeBatch();

【讨论】:

但是我的查询是一个单一的查询。查询没有不同的输入。如何提高性能?【参考方案2】:

将更新分成多个部分可能有助于将更新分成多个事务,但我将从您的数据库设置开始。如果更新需要很长时间,您可能没有将日志大小设置得足够高。也可能存在磁盘瓶颈。

【讨论】:

以上是关于准备好的语句更新 - 性能改进的主要内容,如果未能解决你的问题,请参考以下文章

如何防止准备好的语句更新 TIMESTAMP 列?

在准备好的语句中使用游标进行更新

更新数据库中的数据 - 准备好的语句(PHP)

MySQL & PHP 更新问题,使用准备好的语句

如何使用 AES_ENCRYPT 和 PDO 准备语句改进大型加密数据库的 PHP 解决方法?

使用准备好的语句时是不是需要 mysql_real_escape_string()?