执行某SQL语句后貌似Oracle数据库(12c)服务器CPU占用被拉高,导致所有数据库操作变缓,SQL本身并无特别,大概逻辑如下:
"select sum(a.shuliang) sl from a,b where a.someid_a=? and a.someid_b=? and b.someid_c=? and a.id=b.id"
ps = con.prepareStatement(sql);
if (params != null) {
for (int i = 0; i < params.size(); i++) {
Object v = params.get(i);
ps.setObject(i + 1, v);
}
}
rs = ps.executeQuery();
使用上述SQL的程序一直没有问题,突然一天发现只要执行就会导致数据库变慢,然后在程序中将上述SQL的参数值直接拼入SQL之后(如下),拖慢问题不再出现,同处理中的其他SQL也使用了参数形式但唯独此SQL有问题。
"select sum(a.shuliang) sl from a,b where a.someid_a='"+变量A+"' and a.someid_b='"+变量B+"' and b.someid_c='"+变量C+"' and a.id=b.id"
求解。
oracle中sql语句如用了绑定变量,根据变量采样数据形成的执行计划,可能会和实际的数据分布不一致,造成性能低下。
字符串拼接形成的sql不存在此类问题,但会带来硬解析过多,在并行执行sql多的情况会严重影响数据库整体性能。
如果能确认合理的执行计划,可以通过hints或outline固化执行计划。