有个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把页级锁改成行级锁这样的操作,麻烦大家帮忙指导一下看看是不是这个问题,还是有其他原因?

解决方案 »

  1.   

    但是如果修改一下,这样执行就很快,不明白到底什么原因,求指点:
    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)
      

  2.   

    看查询计划吧
    这条语句的快慢跟exist子句里面的数据集大小有关系的,可以替换成in子句试试
      

  3.   

    exist子句里面的数据集查询结果其实是没有记录的,换成in也是比较慢。
      

  4.   

    tic_service_map 里面有没有主键字段? 
    或者试试看
    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)
    这样,兴许也还比较快。
      

  5.   


    你認為你這樣刪和你之前的刪除沒有什麼區別嗎?
    後面的寫法當exists存在時,難道不會把你tic_service_map表中所有的數據刪除掉?還有你兩種刪除方式,是在相同數據的情況下嗎,如果不是相同的數據,則在數據量一定數量級時,是不能一起這麼簡單的比較的
      

  6.   


    是相同的数据情况,就是因为这个SQL执行慢所以试着修改成第二种方法,自己也不是很清楚,烦请详解。还有就是有朋友说在Informix数据库中也遇到这种情况,将页级锁改成行级锁执行就快了;但是在oracle好像只有表级锁和行级锁,好像是自己生成的,所以就不知道该怎么操作;或是有其他什么原因造成的。
      

  7.   


    有主键字段record_id,这样改的话跟我之前试的第二种差不多都很快,想问下有没有什么方法通过修改表结构来优化语句的?