有个SQL执行需要3到5分钟,但在程序中同一SQL有很多,所以会导致程序运行总时长变得很慢:
delete from tic_service_map
where exists(
select 1 from tic_service_usr u,tic_service_rule r
where tic_service_map.rule_id = u.rule_id
and tic_service_map.ne_id = u.ne_id
and tic_service_map.ne_type = u.ne_type
and u.use_type = 0
and u.rule_id = r.rule_id
and r.del_flag = 0)
也找朋友看过,说把页级锁改成行级锁应该就可以了,但是我找了半天好像也没有关于oracle把页级锁改成行级锁这样的操作,麻烦大家帮忙指导一下看看是不是这个问题,还是有其他原因?
delete from tic_service_map
where exists(
select 1 from tic_service_usr u,tic_service_rule r
where tic_service_map.rule_id = u.rule_id
and tic_service_map.ne_id = u.ne_id
and tic_service_map.ne_type = u.ne_type
and u.use_type = 0
and u.rule_id = r.rule_id
and r.del_flag = 0)
也找朋友看过,说把页级锁改成行级锁应该就可以了,但是我找了半天好像也没有关于oracle把页级锁改成行级锁这样的操作,麻烦大家帮忙指导一下看看是不是这个问题,还是有其他原因?
delete from tic_service_map
where exists(
select 1 from tic_service_usr u,tic_service_rule r,tic_service_map
where tic_service_map.rule_id = u.rule_id
and tic_service_map.ne_id = u.ne_id
and tic_service_map.ne_type = u.ne_type
and u.use_type = 0
and u.rule_id = r.rule_id
and r.del_flag = 0)
这条语句的快慢跟exist子句里面的数据集大小有关系的,可以替换成in子句试试
或者试试看
delete from tic_service_map
where rowid in(
select tic_service_map.rowid from tic_service_usr u,tic_service_rule r,tic_service_map
where tic_service_map.rule_id = u.rule_id
and tic_service_map.ne_id = u.ne_id
and tic_service_map.ne_type = u.ne_type
and u.use_type = 0
and u.rule_id = r.rule_id
and r.del_flag = 0)
这样,兴许也还比较快。
你認為你這樣刪和你之前的刪除沒有什麼區別嗎?
後面的寫法當exists存在時,難道不會把你tic_service_map表中所有的數據刪除掉?還有你兩種刪除方式,是在相同數據的情況下嗎,如果不是相同的數據,則在數據量一定數量級時,是不能一起這麼簡單的比較的
是相同的数据情况,就是因为这个SQL执行慢所以试着修改成第二种方法,自己也不是很清楚,烦请详解。还有就是有朋友说在Informix数据库中也遇到这种情况,将页级锁改成行级锁执行就快了;但是在oracle好像只有表级锁和行级锁,好像是自己生成的,所以就不知道该怎么操作;或是有其他什么原因造成的。
有主键字段record_id,这样改的话跟我之前试的第二种差不多都很快,想问下有没有什么方法通过修改表结构来优化语句的?