某语句导致Oracle数据库CPU占用率高

执行某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"

求解。

阅读 3.4k
1 个回答

oracle中sql语句如用了绑定变量,根据变量采样数据形成的执行计划,可能会和实际的数据分布不一致,造成性能低下。
字符串拼接形成的sql不存在此类问题,但会带来硬解析过多,在并行执行sql多的情况会严重影响数据库整体性能。

如果能确认合理的执行计划,可以通过hints或outline固化执行计划。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进