鍍金池/ 問答/室內(nèi)設(shè)計  數(shù)據(jù)庫/ 某語句導致Oracle數(shù)據(jù)庫CPU占用率高

某語句導致Oracle數(shù)據(jù)庫CPU占用率高

執(zhí)行某SQL語句后貌似Oracle數(shù)據(jù)庫(12c)服務(wù)器CPU占用被拉高,導致所有數(shù)據(jù)庫操作變緩,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ā)現(xiàn)只要執(zhí)行就會導致數(shù)據(jù)庫變慢,然后在程序中將上述SQL的參數(shù)值直接拼入SQL之后(如下),拖慢問題不再出現(xiàn),同處理中的其他SQL也使用了參數(shù)形式但唯獨此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語句如用了綁定變量,根據(jù)變量采樣數(shù)據(jù)形成的執(zhí)行計劃,可能會和實際的數(shù)據(jù)分布不一致,造成性能低下。
字符串拼接形成的sql不存在此類問題,但會帶來硬解析過多,在并行執(zhí)行sql多的情況會嚴重影響數(shù)據(jù)庫整體性能。

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

2018年6月16日 23:58