【发布时间】:2012-03-21 07:56:27
【问题描述】:
我有一个名为 TeacherClass 的复合表,它有两列,TeacherID 和 ClassID。主键是 TeacherID 和 ClassID。即使这些也被视为外键,我是否应该为每一列分别添加一个索引,即使它们都有一个从主键组合在一起的索引?
【问题讨论】:
标签: sql-server indexing foreign-keys primary-key composite-key
我有一个名为 TeacherClass 的复合表,它有两列,TeacherID 和 ClassID。主键是 TeacherID 和 ClassID。即使这些也被视为外键,我是否应该为每一列分别添加一个索引,即使它们都有一个从主键组合在一起的索引?
【问题讨论】:
标签: sql-server indexing foreign-keys primary-key composite-key
如果它们都是 PK 的一部分,那么很可能已经在聚集索引中,但是索引将具有,例如 (TeacherID, ClassID),而不是相反(ClassID,TeacherID)。这意味着该表在运行类似以下内容时会很快:
SELECT * FROM TeacherClass WHERE TeacherID = 9
但跑起来很慢
SELECT * FROM TeacherClass WHERE ClassID = 9
如果您计划运行类似的选择语句,请按该顺序添加包括 ClassID 和 TeacherID 的新索引。这样您就不需要任何单独的索引(拥有一个包含 Col1 和 Col2 的索引,会使仅包含 Col1 的索引变得多余)。
【讨论】:
如果您在 (TeacherID, ClassID) 上有一个主键,那么您已经在这两个上有一个索引。
但是,仅使用 ClassID 作为其参数的查询将无法利用该索引 - 该索引仅适用于 (TeacherID) 或 (TeacherID, ClassID)。
所以是的 - 如果您将 ClassID 列用作其他表的外键,我肯定会认为您应该只在 (ClassID) 上放置索引。
但是,仅在 TeacherID 上的索引是完全多余的。
【讨论】: