带外键的表delete时很慢,但插入却正常

niujw002 2010-06-12 05:29:33
有两个表A、B,表A以表B的主键为外键。批量插入时,速度很快。但删除表中的部分内容时,慢得受不了。删除时我是先删A表,再删B表的。我的问题是:我觉得插入和删除都要维护外键关系,但为什么插入不慢而删除慢呢,有没有什么办法能提高效率呢?
...全文
348 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2010-06-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 niujw002 的回复:]
我现在是删除B表的时候慢,而且我是先删了A表,谁能解释一下删除B表时,数据库都在干什么呢?oracle的cpu利用率达到100%。
[/Quote]
有外键嘛,它要检测自己被关联的键是否存在从表项,当你的A表数据较多时,每删除一条B表记录都会检测一次,这样能不慢吗?如果你对数据完整性要求不高,特别是先删除主表再删从表都可以的情况,那么还是建议不要设置外键了,设置了在删除时就慢,其实也影响插入的,从表插入要检测主表,但是主表内容显然不多,比从表少很多,所以相应的检测速度较快。
niujw002 2010-06-17
  • 打赏
  • 举报
回复
我现在是删除B表的时候慢,而且我是先删了A表,谁能解释一下删除B表时,数据库都在干什么呢?oracle的cpu利用率达到100%。
niujw002 2010-06-13
  • 打赏
  • 举报
回复
我把分区都去掉了,确实快了一些,但还是比较慢。
qldsrx 2010-06-13
  • 打赏
  • 举报
回复
我怀疑是你分区太多的原因,它要多分区查找记录。至于外键是否也有影响,你可以先尝试将外键删除了插入并删除新插入数据,测试下就知道了。
niujw002 2010-06-13
  • 打赏
  • 举报
回复
还有,就是为什么批量插入时不慢呢?插入和删除对于外键的操作原则上不是一样的么?
niujw002 2010-06-13
  • 打赏
  • 举报
回复
主外键都建立索引了。我没用Hibernate删除,是用jdbc。而且每个表还有70个分区。是不是和分区有关呢?谢谢各位。
xmankevin1980xman 2010-06-13
  • 打赏
  • 举报
回复
你可以写个触发器在A表上,写上DELETE B表 WHERE ...
这样你删时就不会太慢了
dlpseeyou 2010-06-13
  • 打赏
  • 举报
回复
建立索引
wffffc 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tangren 的回复:]
2、请在外键上建立索引
[/Quote]
11
碧水幽幽泉 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dawugui 的回复:]
引用楼主 niujw002 的回复:
有两个表A、B,表A以表B的主键为外键。批量插入时,速度很快。但删除表中的部分内容时,慢得受不了。删除时我是先删A表,再删B表的。我的问题是:我觉得插入和删除都要维护外键关系,但为什么插入不慢而删除慢呢,有没有什么办法能提高效率呢?

主外键表的删除本身就慢,你可以考虑对相关字段建议索引.或者取消主外键关系.
[/Quote]
支持!
dawugui 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 niujw002 的回复:]
有两个表A、B,表A以表B的主键为外键。批量插入时,速度很快。但删除表中的部分内容时,慢得受不了。删除时我是先删A表,再删B表的。我的问题是:我觉得插入和删除都要维护外键关系,但为什么插入不慢而删除慢呢,有没有什么办法能提高效率呢?
[/Quote]
主外键表的删除本身就慢,你可以考虑对相关字段建议索引.或者取消主外键关系.
tangren 2010-06-12
  • 打赏
  • 举报
回复
1、插入是否按条插入,而删除则批量?
2、请在外键上建立索引
iihero 2010-06-12
  • 打赏
  • 举报
回复
定义表时加入cascade delete?
删除可否采用cascade delete?

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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