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

时间:2010-09-06 10:23:27

标签: sql sql-server tsql

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

4 个答案:

答案 0 :(得分:52)

是的,这是一个很好的做法,请看这里:When did SQL Server stop putting indexes on Foreign Key columns?向下滚动到索引外键列是否有任何好处?部分

答案 1 :(得分:39)

每个外键?在选择性低的情况下(即,许多值是重复的),索引可能比表扫描更昂贵。此外,在高活动环境中(比查询更多的插入/更新/删除活动)维护索引的成本可能会影响系统的整体性能。

答案 2 :(得分:16)

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

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

select ActionName from [UserAction] where UserID = @UserID

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

答案 3 :(得分:5)

来自MSDN:FOREIGN KEY Constraints

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

  • 使用相关表中的FOREIGN KEY约束检查对PRIMARY KEY约束的更改。
  • 当来自相关表的数据通过将一个表的FOREIGN KEY约束中的一列或多列与另一个表中的主键或唯一键列匹配时,外键列经常用于连接条件。