鍍金池/ 問答/室內設計  數據庫/ 某語句導致Oracle數據庫CPU占用率高

某語句導致Oracle數據庫CPU占用率高

執(zhí)行某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的程序一直沒有問題,突然一天發(fā)現只要執(zhí)行就會導致數據庫變慢,然后在程序中將上述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語句如用了綁定變量,根據變量采樣數據形成的執(zhí)行計劃,可能會和實際的數據分布不一致,造成性能低下。
字符串拼接形成的sql不存在此類問題,但會帶來硬解析過多,在并行執(zhí)行sql多的情況會嚴重影響數據庫整體性能。

如果能確認合理的執(zhí)行計劃,可以通過hints或outline固化執(zhí)行計劃。

2018年6月16日 23:58