【问题标题】:Do you really need indexes on Foreign Keys in SQL Server?您真的需要 SQL Server 中的外键索引吗?
【发布时间】:2018-07-03 16:48:16
【问题描述】:

多年来,我看到各种文章表明在 SQL Server 数据库中索引外键列是个好主意。我们的大型数据库大部分都在每个外键列上都有索引。

不过,在查看 MS DM 视图中的索引使用情况时,其中许多索引的明显使用情况(搜索、扫描和查找)显示为零。

删除其中一些索引将节省大量磁盘空间,并且使用率似乎为零,但是否存在各种内部和显式 SQL 服务器操作和连接仍在以某种方式使用这些索引,不一定会出现在MS index dm 查看统计数据?

如果有任何使用它们的机会,我不想删除它们并损害性能。

【问题讨论】:

  • 感觉你在dba.stackexchange.com上研究会得到更好的结果
  • 零使用从什么时候开始?索引使用 DMV 在服务重启甚至索引删除/创建等事件时重置。在确定索引无用之前,请确保您观察了整个商业周期。它可能仅用于月末或季度末运行的报告,当 CTO 突然感兴趣时,可能会在某处明确暗示,等等。当然,使用频率与该索引在使用时的有用程度无关用来。当然可以随意过早地删除这些索引中的任何一个。但是,当指数预计会存在而实际不存在时,请为后果做好准备。
  • 监控多个客户端数据库超过 6 个月,大多数示例系统没有重新启动并且有几个月的历史记录。在抽样中,我确保系统至少运行了 60 天以上,或者它不被视为 DM 零使用候选的一个很好的例子。我相信 DM View 统计数据在我收集的汇总数据中可能是可靠的,并且应该涵盖罕见的使用示例。我想这个问题仍然主要是同一个问题。连接是否以正常方式使用索引,在 DM 视图中将其切换为搜索、扫描或查找?

标签: sql-server performance indexing


【解决方案1】:

您不需要对未在有益的操作(例如 JOIN 或 WHERE 子句)中使用的列建立索引。

如果您在每个列上都有索引,则可能有很多可以删除。您甚至可能会获得性能提高,因为即使没有使用索引也需要维护。

我不确定我对 DM 的看法有多信任。它们经过严格过滤,可能无法向您显示实际发生的情况,具体取决于对象所在的位置以及您的权限。

【讨论】:

  • 我们不会在每一列上使用索引,而是在每个外键列上使用 DBA 先前添加的索引作为“最佳实践”建议。其中一些可能是很好的补充,但许多客户端的使用率为零,我可以通过删除它们来收回大约 15% 的数据库空间。我们显然没有在每一列上都有索引。索引是在正常的调整审查中评估的,但外键的全面添加似乎过多,想要删除其中一些,但担心外键连接等固有操作确实会在 DM View stats 中捕获
  • 这真的是一种“试试看”的东西。您可能有一个每年使用一次的索引,但它是运行 10 分钟或 500 分钟的进程之间的差异
猜你喜欢
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 2011-10-02
  • 2011-05-25
  • 1970-01-01
  • 2011-07-26
  • 2011-05-06
  • 1970-01-01
相关资源
最近更新 更多