在很多时候,我们可能会觉得对于数据库本身我们已经将性能优化再优化了,为什么还会出现以下几种情况:
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();
使用场合:
有批量作业需要处理的场合,能大幅提升性能。