深入理解Oracle索引(20):外键是否应该加索引

本文通过一个实例测试,探讨了在Oracle数据库中,外键是否应该添加索引的问题。测试结果显示,外键无索引可能导致锁获取失败,影响表的操作。建议对外键进行适当的索引设计,以优化数据库性能。
摘要由CSDN通过智能技术生成
     先表明我的立场、我是绝对支持外键一定要加索引!
     虽然在高版本的Oracle里、对这个要求有所降低、但依然有如下原因:
     
     ① 死锁
        
        外键未加索引是导致死锁的最主要原因、因为
        无论更新父表主键、或者删除一个父表记录、都会在子表加一个表锁
        这就会不必要的锁定更多的行、从而影响并发性
        
     
     ② ON DELETE CASCADE
        
        对于删除的每一个父行、都会把子表全表扫描一次
        如:
        EMP是DEPT的子表
        DELETE dept WHERE deptno=10 会级联至EMP
        
     
     ③ 从父表查询子表
        
        如:
        EMP是DEPT的子表
        SELECT * 
          FROM dept,emp
         WHERE emp.deptno=dept.deptno and
               dept.dname= :X
     
     
     另外、证明子表由于外键未加索引而被锁住、可经由下列方法:
     
     ALTER TABLE <child table name> DISABLE TABLE LOCK;
     
     那么、对父表的可能导致表锁的任何 UPDATE 或 DELETE 都会收到如下错误:
     
     ERROR at line 1:

     ORA-00069: cannot acquire lock -- table locks disable for <child table name>


     以下做个简单的外键未加索引的测试:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值