Oracle外键需要建索引吗?】的更多相关文章

关于Oracle中的外键,首先要说明一下. 1. 除非已定义了父表主键或唯一键约束,否则oracle将不允许创建子表的外键约束. 2. 在定义外键约束时,oracle不会自动创建索引,所以必须手动在与外键约束相关的列上创建索引. 所以我们这里要研究的是否需要在子表中创建索引,因为父表中对应的列是一定有索引的. 如果子表中的外键不创建索引,将导致两个问题. 1. 影响性能. 如果子表外键没有创建索引,那么当父表查询关联子表时,子表将进行全表扫描. 2. 影响并发. 如果子表外键没有创建索引,那么在…
外键加索引是常识,必须牢记.本来不想写这样的简单案例.可是连续遇到好几起外键不加索引导致性能问题,所以还是写一下. 一个兄弟问我 delete from Sa_Sales_Comm_Detail s where s.sales_commission_id=24240;  ---删除105条数据很慢.要跑几十秒到上百秒 这个表总数据才35万行,sales_commission_id 列有索引,运行计划也确实是走了索引. 走索引返回105 条数据.不可能跑几十秒跑上百秒的. 之后我问他 select…
转载链接:http://www.jb51.net/article/50161.htm 这篇文章主要介绍了Oracle外键不加索引引起死锁的情况及解决,需要的朋友可以参考下 --创建一个表,此表作为子表 create table fk_t as select * from user_objects; delete from fk_t where object_id is null; commit; --创建一个表,此表作为父表 create table pk_t as select * from…
外键列上缺少索引会带来两个问题,限制并发性.影响性能.而这两个问题中的任意一个都可能会造成严重性能问题.   无论是Oracle的官方文档,还是在Tom的书中都说明了两种情况下可以忽略外键上的索引.其实我认为不需要那么麻烦,与增加一个   索引所带来的性能开销和磁盘空间开销相比,缺失索引可能引发的问题要严重得多.因此,我会选择在所有的外键列上添加索引,虽然   可能导致创建了部分多余的索引,但是这样相除了外键约束由于确实索引所带来的性能问题和并发性问题.   如果外键列上缺少索引,从主表关联子表…
根据我的经验,导致死锁的头号原因是外键未加索引(第二号原因是表上的位图索引遭到并发更新).在以下两种情况下,Oracle在修改父表后会对子表加一个全表锁: 1)如果更新了父表的主键(倘若遵循关系数据库的原则,即主键应当是不可变的,这种情况就很少见),由于外键上没有索引,所以子表会被锁住. 2) 如果删除了父表中的一行,整个子表也会被锁住(由于外键上没有索引).   除了全表锁外,在以下情况下,未加索引的外键也可能带来问题: 1) 如果有ON DELETE CASCADE,而且没有对子表加索引:例…
在oracle中,如果外键未加索引,对父表的修改,会导致子表被加上全表锁.这包括两种情况: 1.删除父表中的行,如果外键上没有索引,会导致子表被加上全表锁 2.更新父表的主键(根据关系数据库的原则,更新主键是一个巨大的"禁忌",所以一般不会出现这种情况),如果外键上没有索引,会导致子表被加上全表锁 虽然,在Oracle9i及以上的版本中,这些全表锁都是短期的,他们仅在DML操作期间存在,而不是在整个事务的期间都存在.但是即使如此,这些全表锁还是可能(而且确实会)导致很严重的锁定问题.…
Oracle外键(Foreign Key)使用详细的说明(一) 1.目标 演示如何Oracle使用外键数据库 2.什么是外键? 1)在Oracle数据库中,外键是用来实现參照完整性的方法之中的一个.打个形象的比喻.外键是指定义外键的表的列的值必须在还有一个表中出现. 2)被參照的表称之为父表(parent table),创建外键的表称之为子表(child table).子表中的外键关联了父表中的主键. 3)外键能够在创建表时定义或者通过ALTER TABLE语句创建. 3.创建表时定义外键 语法…
本文讨论一下Oracle中的外键约束问题,以及和DB2中的小不同. 首先创建测试环境. -- 创建测试主表. ID 是主键. CREATE TABLE test_main ( id INT, value ), PRIMARY KEY(id) ); -- 创建测试子表. CREATE TABLE test_sub ( id INT, main_id INT, value ), PRIMARY KEY(id) ); -- 插入测试主表数据. INSERT INTO test_main(id, val…
今天有位自己填上一坑:mysql储存引擎 原因就是数据库表引擎为:MyISAM,建立主外键关系需要是InnoDB: 解决方案:alter  table table_name1  engine=innodb;改变两个表的引擎: 如果还是不行:删除外键表数据,建立外键索引,再次建立主外键关系. 再次将数据添加回去. 转载于:http://blog.csdn.net/xifeijian/article/details/20316775: MyISAM 和InnoDB 讲解 InnoDB和MyISAM是…
Oracle数据库中,外键约束只允许级联删除,不允许级联更新,因此,如果想要实现主表数据更新后,子表外键自动更新,只能取消外键关系,通过前端程序来维护实现完整引用,一个代替的解决方案是使用延迟约束和触发器: 1:建立延迟外键约束: Alter table slavetable add constraint FK_ST_FID references primarytable (PID) on delete cascade deferrable; 2:建立触发器: create or replace…