【问题标题】:Composite Tables, Primary Keys, Foreign Key, and Indexing in SQL ServerSQL Server 中的复合表、主键、外键和索引
【发布时间】:2012-03-21 07:56:27
【问题描述】:

我有一个名为 TeacherClass 的复合表,它有两列,TeacherID 和 ClassID。主键是 TeacherID 和 ClassID。即使这些也被视为外键,我是否应该为每一列分别添加一个索引,即使它们都有一个从主键组合在一起的索引?

【问题讨论】:

    标签: sql-server indexing foreign-keys primary-key composite-key


    【解决方案1】:

    如果它们都是 PK 的一部分,那么很可能已经在聚集索引中,但是索引将具有,例如 (TeacherID, ClassID),而不是相反(ClassID,TeacherID)。这意味着该表在运行类似以下内容时会很快:

    SELECT * FROM TeacherClass WHERE TeacherID = 9
    

    但跑起来很慢

    SELECT * FROM TeacherClass WHERE ClassID = 9
    

    如果您计划运行类似的选择语句,请按该顺序添加包括 ClassID 和 TeacherID 的新索引。这样您就不需要任何单独的索引(拥有一个包含 Col1 和 Col2 的索引,会使仅包含 Col1 的索引变得多余)。

    【讨论】:

      【解决方案2】:

      如果您在 (TeacherID, ClassID) 上有一个主键,那么您已经在这两个上有一个索引。

      但是,仅使用 ClassID 作为其参数的查询将无法利用该索引 - 该索引仅适用于 (TeacherID)(TeacherID, ClassID)

      所以是的 - 如果您将 ClassID 列用作其他表的外键,我肯定会认为您应该只在 (ClassID) 上放置索引。

      但是,仅在 TeacherID 上的索引是完全多余的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-22
        • 2022-11-21
        相关资源
        最近更新 更多