请问这里的update sql怎么优化,数据比较多的时候

update cbs_contractlife set back_date =to_date('2014-11-17','yyyy-mm-dd') where policy_code ='6663131080120140003518' and status ='1';

update cbs_receiptinfo set back_date = to_date('2015-10-13','yyyy-mm-dd') where policy_id = (select policy_id from cbs_contractlife where policy_code ='9251645A75515000808' ) and rec_type ='0';

就这两个sql,只不过量比较大,三万条,好吧也不是很大,但是oracle要跑40分钟,然后两道就不乐意了,这要怎么改啊,要创建新的表吗

加上索引,语句优化

policy_code和policy_id上建索引。另外如果一次update的数据量比较多,不要一次性提交,分批次更新提交。

这是cbs_receiptinfo的结构
cbs_receiptinfo的索引
主键是SEQ_ID
cbs_contractlife的结构
cbs_contractlife的索引
主键仍为SEQ_ID

cbs_contractlife.policy_code
cbs_contractlife.status
cbs_receiptinfo.policy_id
cbs_receiptinfo.rec_type
四个字段建索引

如果存在索引,可以做下索引重建

update cbs_contractlife set back_date =to_date('2014-11-17','yyyy-mm-dd') where policy_code ='6663131080120140003518' and status ='1';
//这条语句速度应该不慢,如果慢的话,在cbs_contractlife的policy_code上加索引

update cbs_receiptinfo set back_date = to_date('2015-10-13','yyyy-mm-dd') where policy_id = (select policy_id from cbs_contractlife where policy_code ='9251645A75515000808' ) and rec_type ='0';

//在表cbs_contractlife增加policy_code索引