每个SQL Server外键都应该有一个匹配的索引吗?


70

为SQL Server数据库中的每个外键创建索引是一种好习惯吗?

Answers:



49

每个外键?否。在选择性较低的情况下(即,许多值重复),索引可能比表扫描的开销更大。同样,在活动频繁的环境中(插入/更新/删除活动比查询多得多),维护索引的成本可能会影响系统的整体性能。


2
好。那么,是否有一些数字限制或阈值可能会触发索引的创建?
GRGodoi

18

为外键列建立索引的原因与为其他任何列建立索引的原因相同:如果要按列过滤行,则创建索引。

例如,如果您具有表[User](ID int,名称varchar(50))和表[UserAction](UserID int,Action varchar(50)),则您很可能希望能够找到特定用户的操作做到了。例如,您将运行以下查询:

select ActionName from [UserAction] where UserID = @UserID

如果您不打算按该列过滤行,则无需在其上放置索引。即使您这样做,只有拥有超过20到30行,才值得。


1
您确定在对UserAction执行插入操作时,该索引在外键验证期间不会有用吗?
GRGodoi 2012年

1
否。验证是针对具有主键或唯一约束(例如[User]。[ID])的表和列进行的。无需验证[UserAction]表的UserID列。您只能引用具有主键或唯一约束的列,因此始终对其进行索引。
ItsMe 2012年

7
其他动作要考虑的是删除行从User,这将导致引擎来寻找行UserAction基础上UserID
TJ Crowder

5

来自MSDN:外键约束

由于以下原因,在外键上创建索引通常很有用:

  • 使用相关表中的FOREIGN KEY约束检查对PRIMARY KEY约束的更改。
  • 通过将一个表的FOREIGN KEY约束中的一个或多个列与另一表的一个或多个主键或唯一键匹配,将相关表中的数据合并到查询中时,外键列通常用于联接条件中。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.