SQL Server索引 - 索引中包含哪些列?

joh*_*hna 6 sql-server

问题1:在SQL Server数据库中为外键列创建索引是否值得?

Q2:如果我在SQL Server数据库中有两个相关的表,并且我想在外键列上创建索引以提高性能,那么我需要在索引中包含哪些列以及哪种类型的索引最适合?

例如...

Table1

Table1ID int(主键)

Table2

Table2ID int(主键)
Table1ID int(外键)

..我是否只使用Table1ID为Table2创建索引,或者我是否还需要包含主键(Table2ID).

问题3:如果我扩展示例以包含与Table1和Table2相关的第三个表,我是为每列创建一个索引还是为两个列创建一个索引?

Table3

Table3ID int(主键)
Table1ID int(外键)
Table2ID int(外键)

Mit*_*eat 6

Q1.是的.(如果您发现它们没有被定期使用,您可以随后将其删除).

Q2.我会使用Table1ID为Table2创建一个索引吗?是的.假设索引的主要用途是帮助优化器在这两个表之间进行连接.(而不是满足作为整体查询工作负载一部分的其他一些查询).

Q3.是的.具有外键的每列应具有与其父键表相对应的单独索引.

(假设您拥有OLTP数据库而不是OLAP数据库)

这篇文章提供了TSQL,它将生成数据库中所有缺少的外键索引的脚本:TSQL:生成缺少的外键索引

  • 通常,所有FK索引都是非聚集的. (2认同)