【问题标题】:Should every SQL Server foreign key have a matching index? [closed]每个 SQL Server 外键都应该有一个匹配的索引吗? [关闭]
【发布时间】:2010-09-06 10:23:26
【问题描述】:

为 SQL Server 数据库中的每个外键建立索引有哪些优点(如果有的话)?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    是的,这是一个很好的做法,请参阅此处:When did SQL Server stop putting indexes on Foreign Key columns? 向下滚动到 为外键列建立索引有什么好处吗? 部分

    【讨论】:

    • 在某些情况下这是一个很好的做法,但不适用于 每个 外键。
    【解决方案2】:

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

    【讨论】:

    • 好的。那么是否有一些数字限制或阈值可能会触发索引的创建?
    【解决方案3】:

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

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

    select ActionName from [UserAction] where UserID = @UserID
    

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

    【讨论】:

    • 当我在 UserAction 上执行插入时,您确定在外键验证期间索引不会有用吗?
    • 没有。验证是针对包含主键或唯一约束(例如 [User].[ID])的表和列进行的。无需验证 [UserAction] 表的 UserID 列。您只能引用具有主键或唯一约束的列,因此它始终被索引。
    • 另一个要考虑的操作是从User 中删除行,这会导致引擎根据UserIDUserAction 中查找行。
    【解决方案4】:

    来自 MSDN:FOREIGN KEY Constraints

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-24
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      相关资源
      最近更新 更多