Answers:
仅外键约束不能提供Oracle的索引-必须(应该)创建一个。
oracle
但是当您从Google搜索中找到该问题时,问题并不会立即显而易见。
创建外键不会自动在A.B_ID上创建索引。因此,从查询性能的角度来看,在A.B_ID上创建单独的索引通常是有意义的。
如果您曾经删除B中的行,则肯定要为A.B_ID编制索引。否则,每次您从B删除一行时,Oracle都必须对A进行全表扫描,以确保没有孤立的记录(根据Oracle版本的不同,可能还有其他的锁定含义,但是这些都将减少)在最新的Oracle版本中)。
B_ID
。
只是为了获取更多信息:Oracle不会自动创建索引(就像对唯一约束一样),因为(a)不需要强制执行约束,并且(b)在某些情况下不需要索引。
但是,大多数时候,您将需要创建一个索引(实际上,在Oracle Apex中,有一个“未索引外键”的报告)。
每当应用程序需要能够删除父表中的行或更新PK值(这种情况比较少见)时,如果不存在索引,则DML会受到影响,因为它必须锁定整个子表。
我通常选择不添加索引的情况是FK在定义列域(例如状态码表)的“静态数据”表中,而对父表的更新和删除从未完成直接由应用程序。但是,如果在列上添加索引可以使应用程序中的重要查询受益,那么索引仍然是一个好主意。
出于性能原因,应创建索引。用于主表的删除操作(以检查是否使用了要删除的记录)和通常涉及外键的联接。只有少数几张表(我没有在日志中创建它们)可能不需要索引,但是在这种情况下,您可能也不需要外键约束。
但
有些数据库已经自动在外键上创建索引。Jet引擎(Microsoft Access文件)Firebird MySQL
当然
SQL Server甲骨文
才不是
UNIQUE,PRIMARY KEY和FOREIGN KEY约束生成强制或“约束”约束的索引(有时称为后备索引)。PRIMARY KEY约束生成唯一索引。FOREIGN KEY约束会生成非唯一索引。如果所有列都不为空,则UNIQUE约束将生成唯一索引;如果一个或多个列为可为空,则UNIQUE约束将生成非唯一索引。因此,如果一列或一组列具有UNIQUE,PRIMARY KEY或FOREIGN KEY约束,则无需在这些列上创建索引以提高性能。