在很多时候,我们可能会觉得对于数据库本身我们已经将性能优化再优化了,为什么还会出现以下几种情况:

1.      OLTP系统中Package cache过度消耗

2.      需要返回大量结果集的查询语句性能很差

3.      需要插入大量记录到数据库,逐条逐条的插入的时候发现性能低下

 

这个时候,我们可以考虑可能是应用引起的性能问题,下面我们通过三招来尝试解决以上三种情况。

 

 

第一招:解决硬解析的利器-绑定变量

背景:

    绑定变量是解决动态语句硬解析的利器,能解决OLTP系统中Package cache的过度耗用以提高性能。

 

用法:
//激活语句集中器
  db2 update db cfg using STMT_CONC LITERALS
//下面的JAVA代码使用绑定变量,避免对动态语句硬解析
PrepareStatement p =conn.prepareStatement
          (“SELECT name FROM emp WHERE id =? AND dept =?”);
p.setlnt(1,314159);
p.setString(2, “SALES”)

 

使用场合:

在OLTP环境中SQL语句重复执行频度高,但处理的数据量较少,结果集也相对较小,解析时间通常会接近或高于执行时间,因此该场合适合使用绑定变量

 

 

 

第二招:从数据库到应用-行预取

背景:

有时候,我们发现一个需要返回大量结果集的查询语句性能很差,但是却不是数据库引擎导致的,而是应用导致的,怎么解决呢?

用法:
//方法1:
ConnProp = new Properties();
connProp.put(“defaultRowPrefetch”, 100)
dataSource.setConnectionProperties(connProp);
 
//方法2
Sql = “select id, name from t”
Statement = connection.prepareStatment(sql);
Resultset = statement.executeQuery();

使用场合:

应用程序请求驱动从数据库返回记录的时候,会读取多条满足条件的记录并存储在客户端的内存中,这样后续的请求可以从客户端的内存中直接去读取。

 

 

 

第三招:从应用到数据库-批量提交

背景:

有时候,我们需要插入大量记录到数据库,如果逐条逐条的插入,则性能低下,这个也不是数据库引擎导致的,应用需要优化,那么如何解决呢?

 

用法:

Sql = “insert into t values(?,?)”
Statement = connection.prepareStatement(sql);
for(int i=1;i<100000;i++)
{
Statement.setlnt(1,i);
Statement.setString(2,”hello…”);
Statement.addBatch();
}
Statement.executeBatch();
Statement.close();

 

使用场合:

有批量作业需要处理的场合,能大幅提升性能。