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

为SQL Server数据库中的每个外键创build索引是否是一种好的做法?

是的,这是一个很好的做法,请看这里: SQL Server何时停止在外键列上放置索引? 向下滚动到索引外键列有什么好处? 部分

每一个外键? 不。在select性低的地方(即许多值被重复),索引可能比表扫描更昂贵。 而且,在高活动的环境下(更多的插入/更新/删除活动比查询)维护索引的成本可能会影响系统的整体性能。

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

例如,如果你有table [User](ID int,Name varchar(50))和table [UserAction](UserID int,Action varchar(50)),你很可能希望能够find一个特定的用户没有。 例如,您将运行以下查询:

select ActionName from [UserAction] where UserID = @UserID 

如果您不打算按列过滤行,则不需要在其上放置索引。 即使你这样做,只有20-30行以上才值得。

从MSDN: FOREIGN KEY约束

在外键上创build索引通常是有用的,原因如下:

  • PRIMARY KEY约束的更改在相关表中使用FOREIGN KEY约束进行检查。
  • 通过将一个表的FOREIGN KEY约束中的一列或多列与另一个表中的主键或唯一键列进行匹配,将相关表中的数据组合到查询中时,连接条件中经常使用外键列。