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

GRG*_*doi 64 sql t-sql sql-server

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

SQL*_*ace 55

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

  • 在某些情况下这是一个很好的做法,但不是*每个*外键. (3认同)

one*_*hen 43

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

  • 好。那么,是否存在一些可能会触发索引创建的数值限制或阈值? (2认同)

小智 18

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

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

select ActionName from [UserAction] where UserID = @UserID
Run Code Online (Sandbox Code Playgroud)

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

  • 要考虑的另一个操作是从"User"中删除行,这会导致引擎根据`UserID`在`UserAction`中查找行. (6认同)
  • 当我在 UserAction 上执行插入时,您确定在外键验证期间索引不会有用吗? (2认同)

小智 5

来自MSDN:FOREIGN KEY约束

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

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