我的编程空间,编程开发者的网络收藏夹
学习永远不晚

外键无索引引发的血案

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

外键无索引引发的血案

一、故障现象

     周末接到一个CASE,故障描述是,当时业务产生大量的TX锁,DBA因为不怎么了解,锁的原理,盲目的KILL 进程,无法尽快的定位问题。为了不影响业务,重启了数据库,导致大量的用户投诉。

Fri Mar 13 15:05:17 2020

opiodr aborting process unknown ospid (33292328) as a result of ORA-28

Fri Mar 13 15:05:59 2020

opiodr aborting process unknown ospid (34668796) as a result of ORA-28

Fri Mar 13 15:06:11 2020

opiodr aborting process unknown ospid (33554618) as a result of ORA-28

Fri Mar 13 15:06:23 2020

opiodr aborting process unknown ospid (34471986) as a result of ORA-28

Fri Mar 13 15:06:45 2020

二、分析过程

   

1从awrtop 等待事件看,产生大量的TX

外键无索引引发的血案

2awr top sql 

外键无索引引发的血案

3 ASH 分析

外键无索引引发的血案

外键无索引引发的血案

从awr看当时阻塞的应该是insert语句导致,awr执行语句比较长的

而awr中放在首位的是UPDATA及DELETE,没有办法继续看ash一些内容,发现如下表使用比较高,

而在awr中,无此表的相关语句,

从上边分析看出,锁住的有insert语句,因此怀疑为外键没有索引导致。

查看表的结构。

如下:

外键无索引引发的血案

DELETE FROM bTT WHERE id_=:1 引起的,并且 在task_id 字段上不存在索引,

三、结论

 添加表索引后问题解决,再也没有出现过大量enq锁

四、总结

    在ORACLE数据库中,定义外键约束时,ORACLE是不会自动创建对应索引的,必须手动在外键约束相关的列上创建索引。 

外键缺失索引影响

外键列上缺少索引会带来三个问题,限制并发性、影响性能、还有可能造成死锁。所以对于绝大部分场景,我们应该尽量考虑在外键上面创建索引

  1. 影响性能。如果子表外键没有创建索引,那么当父表查询关联子表时,子表将进行全表扫描。影响表连接方式。

  2. 影响并发。无论是更新父表主键,或者删除一个父记录,都会在子表中加一个表锁(在这条语句完成前,不允许对子表做任何修改)。这就会不必要地锁定更多的行,而影响并发性

  3. 在特殊情况下,还有可能造成死锁。

不需要对外键建索引,满足的条件如下:

1. 不会删除父表中的行。

2. 不论是有意还是无意,总之不会更新父表 的唯一 / 主键字段值。

3.  不会从父表联结到子表,  或者更通俗的讲,外键列不支持子表的一个重要访问路径,而且你在谓词中没有使用这些外键累从子表中选择数据 。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

外键无索引引发的血案

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mysql参数max_binlog_cache_size设置不当引发的血案

日常运维中的坑真是防不胜防,不一小心就遇到别人给你挖的坑。最近又遇到经验不足的DBA不知道从哪拷贝的配置文件(据说是当时参加某培训机构视频培训是资料里的模板,真的是误人子弟呀),其中把max_binlog_cache_size设置的只有2G,而MySQL早已将
mysql参数max_binlog_cache_size设置不当引发的血案
2018-05-03

MySQL学习记录之KEY分区引发的血案

需求背景 业务表tb_image部分数据如下所示,其中id唯一,image_no不唯一。image_no表示每个文件的编号,每个文件在业务系统中会生成若干个文件,每个文件的唯一ID就是字段id:业务表tb_image的一些情况如下:根据im
2022-05-30

sql外键引用了无效的表如何解决

在SQL中,如果外键引用了无效的表,通常会收到一个错误消息,指示找不到或无效的引用表。为了解决这个问题,您可以按照以下步骤进行操作:确保引用的表存在:首先要确定引用的表是否存在,并且表名是否拼写正确。如果表名有误,可以通过修改外键约束来修正
sql外键引用了无效的表如何解决
2024-04-09

sql中外键引用了无效的表格怎么办

当 sql 中的外键引用了不存在的表格时,会发生此错误。解决方法包括:检查表格是否存在,重建外键,恢复已删除的表格,检查权限,重新启动数据库。SQL 中外键引用了无效的表格当 SQL 表中的外键引用了不存在或已删除的表格时,就会发生此错误
sql中外键引用了无效的表格怎么办
2024-05-10

sql中外键引用了无效的表格怎么办呢

针对 sql 外键引用无效表的解决方法:1. 重新创建表;2. 删除外键约束;3. 修改外键引用;4. 检查数据库结构;5. 恢复备份。请确保在进行操作前备份数据库并理解对数据的潜在影响。SQL 中外键引用无效表的解决方法当外键引用一个不
sql中外键引用了无效的表格怎么办呢
2024-05-15

一文彻底搞清楚MySQL的主键、外键、约束和各种索引

0.前言 主键用于唯一标识表中每一行数据,外键用于建立表与表之间关联关系,约束用于限制表中数据的规则,索引用于加速查询。 文章目录 0.前言1. 主键1.1. 在创建表时定义主键1.2. 在已有表中添加主键 2. 外键
2023-08-23

如何解决MySQL报错:无法截断被外键约束引用的表

当你试图删除一个被外键约束引用的表时,MySQL会抛出"Cannot truncate a table referenced in a foreign key constraint"错误。这是因为MySQL保护数据完整性,防止删除一个被其他
2023-10-10

编程热搜

目录