【问题标题】:SQL Server indexes - what columns to include in index?SQL Server 索引 - 索引中要包含哪些列?
【发布时间】:2023-03-12 10:58:01
【问题描述】:

Q1:是否值得为 SQL Server 数据库中的外键列创建索引?

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

例如...

Table1

Table1ID int(主键)

Table2

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

..我是只用 Table1ID 为 Table2 创建一个索引,还是我还需要包含主键 (Table2ID)。

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

Table3

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

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    第一季度。 是的。 (如果您发现它们没有被经常使用,您可以随时删除它们)。

    第二季度。我会只使用 Table1ID 为 Table2 创建一个索引吗? 是的。假设索引的主要用途是帮助优化器连接这两个表。 (而不是满足作为整体查询工作负载一部分的其他查询)。

    第三季度。 是的。具有外键的每一列都应该有一个指向其父键表的单独索引。

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

    这篇文章提供了 TSQL,它将为数据库中所有缺失的外键索引生成一个脚本:TSQL: Generate Missing Foreign Key Indexes

    【讨论】:

    • 感谢@Mitch Wheat 的回答,我应该创建什么类型的索引(集群或非集群)?像 CREATE CLUSTERED INDEX IX_Table2_Table1ID ON Table2 (Table1ID) 这样的东西就足够了吗,还是我应该添加任何选项?
    • 一般情况下,所有的FK索引都是非聚集的。
    【解决方案2】:

    您正在考虑创建的索引都不是一个坏主意。但是,如果您正在寻找性能度量,则需要查看最常使用表的方式。 WHERE 子句中的哪些列最多;并以此为基础建立您的索引。

    还要寻找最佳基数并将其放在 WHERE 子句的顶部。也可以考虑分区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多