求解SQL优化!

fanbocheng820 2012-08-06 09:26:33
有个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把页级锁改成行级锁这样的操作,麻烦大家帮忙指导一下看看是不是这个问题,还是有其他原因?
...全文
155 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fanbocheng820 2012-08-06
  • 打赏
  • 举报
回复
但是如果修改一下,这样执行就很快,不明白到底什么原因,求指点:
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)
fanbocheng820 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 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……
[/Quote]

有主键字段record_id,这样改的话跟我之前试的第二种差不多都很快,想问下有没有什么方法通过修改表结构来优化语句的?
fanbocheng820 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 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_i……
[/Quote]

是相同的数据情况,就是因为这个SQL执行慢所以试着修改成第二种方法,自己也不是很清楚,烦请详解。还有就是有朋友说在Informix数据库中也遇到这种情况,将页级锁改成行级锁执行就快了;但是在oracle好像只有表级锁和行级锁,好像是自己生成的,所以就不知道该怎么操作;或是有其他什么原因造成的。
人生无悔 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 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_serv……
[/Quote]

你認為你這樣刪和你之前的刪除沒有什麼區別嗎?
後面的寫法當exists存在時,難道不會把你tic_service_map表中所有的數據刪除掉?

還有你兩種刪除方式,是在相同數據的情況下嗎,如果不是相同的數據,則在數據量一定數量級時,是不能一起這麼簡單的比較的

wuxking 2012-08-06
  • 打赏
  • 举报
回复
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)


这样,兴许也还比较快。
fanbocheng820 2012-08-06
  • 打赏
  • 举报
回复
exist子句里面的数据集查询结果其实是没有记录的,换成in也是比较慢。
mg_chen 2012-08-06
  • 打赏
  • 举报
回复
看查询计划吧
这条语句的快慢跟exist子句里面的数据集大小有关系的,可以替换成in子句试试

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧