【问题标题】:Strange "Missing Index" suggestion from MS-SQL-Server 2019来自 MS-SQL-Server 2019 的奇怪“缺少索引”建议
【发布时间】:2021-02-25 11:50:58
【问题描述】:

SSMS 执行计划给出错误消息“缺少索引”并建议我创建一个包含 10 个字段的长索引:

创建这么长的索引真的有意义吗?

索引建议还包含所有数值字段。 我从不通过数字字段访问表格。

【问题讨论】:

  • 10 columns 确实用不上多少,尤其是当它们位于 INCLUDE 时。通常您希望覆盖一个索引,因为这意味着不需要键查找。当然,这并不是我说索引建议是正确的。那些缺失的索引建议应始终谨慎对待并进行测试。
  • 另请注意:缺少的索引是来自执行计划的建议,而不是错误。
  • 一定要小心翼翼,这只是意味着可能有 some 索引列和包含列的组合会有所帮助,不一定是它给出的那个:请参阅brentozar.com/archive/2017/08/… 和docs.microsoft.com/en-us/previous-versions/sql/… 请通过pastetheplan.com 分享查询计划,也许我们可以帮助您创建更好的索引
  • 顺便说一句,我希望您知道表名和列的含义,因为我怀疑其他人会这样做。为表和列使用简短、清晰的名称,而不是不可读的大写首字母缩略词
  • 我更喜欢将缺失索引称为建议而不是建议。人类需要进行完整性检查,尤其是在建议包含大量列时。

标签: sql-server sql-server-2019


【解决方案1】:

索引键中只有 1 列。很轻。

建议索引的 include 子句中几乎有 10 列。

为了提高效率,仅对搜索的列(在您的情况下为 SPTAG)编制索引并不是一个好的选择,因为数据库引擎需要访问 2 个数据结构:

  1. 首先读取(在索引中查找)以查找符合谓词条件的候选行
  2. 第二次读表找到索引没有的列

但是,如果索引获得了查询的每个子句(SELECT、JOIN/ON、WHERE、GROUP BY、HAVING、ORDER BY)所需的所有列,那么将只有一个数据结构用于提供完整的结果数据集。

优化器将两次读取的成本与扫描表等其他策略的成本进行比较。如果扫描的成本较低,则不会使用索引... 因此,给定索引的推荐策略是将所有数据都包含在其中!

【讨论】:

  • 感谢您提供的信息,但我现在具体要做什么?我应该用 10 列创建索引吗?
  • @SipCat 只获得大约 8% 的速度并使写入速度变慢?我认为您不应该创建这样的索引 - 但与往常一样,您需要使用真实数据并比较实际查询时间。
  • 8 个指数(不是 shure 是 %)只是一个估计值。最好的方法是在创建此索引之前和之后获取计划的成本和 IO/时间统计信息。
  • 如果表只有 11 列,那么 10 列可能是愚蠢的?但有趣的是,如果表有超过 30 列....
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多