【问题标题】:Sometimes bad Performance and Missing Index hint - Why?有时性能不佳和缺少索引提示 - 为什么?
【发布时间】:2025-12-05 05:15:01
【问题描述】:

有时(并非总是)我遇到with 的性能问题。后面的SQL不是很好,但通常(正常工作时)性能就足够了。

现在我注意到有时性能真的很差(大约需要 10 倍的时间)。于是我用执行计划检查了SQL。

如果我遇到性能问题,我会收到消息

缺失索引(影响 59.007):创建非聚集索引 ....

所以当我遇到问题和没有问题时,我检查了命名表的索引。在这两种情况下,我都有相同的索引。

现在我的问题是:

  • 为什么我有时会收到缺少索引的消息,而有时我的命名表的索引没有更改?
  • 您知道为什么我有时会遇到这些性能问题(以及不同的执行计划)吗?

编辑: 创建表语句:

CREATE TABLE [dbo].[t1] (
  [c1] [int] IDENTITY(1,1) NOT NULL,
  [c2] [nvarchar](50) NULL,
  [c3] [nvarchar](50) NULL,
  [c4] [nvarchar](50) NULL,
  [c5] [date] NULL,
  [c6] [date] NULL,
  [c7] [nvarchar](50) NULL,
  [c8] [int] NULL,
  [c9] [int] NULL,
  [c10] [nvarchar](50) NULL,
  [c11] [decimal](15, 2) NULL,
  [c12] [int] NULL,
  [c13] [int] NULL,
  [c14] [nvarchar](50) NULL
) ON [PRIMARY]

5 个单独的索引(4 个非集群,1 个集群)。

【问题讨论】:

  • 用于创建相关表的 SQL 代码和/或脚本在哪里?
  • 不同计划的SQL查询是否相同?如果是这样,您可以尝试添加OPTION(RECOMPILE) 提示以避免参数嗅探。将执行计划上传至brentozar.com/pastetheplan
  • 你能告诉我们在这张表上执行的查询吗?

标签: sql sql-server performance indexing


【解决方案1】:

为什么我有时会收到缺少索引的消息,有时却没有 当我的命名表的索引没有改变?

这完全取决于正在运行的查询,如果 SQL 引擎认为索引会帮助它选择完成该查询的计划,那么它会告诉您。

注意:这些并不总是最好的!

引擎不会生成“最佳”执行计划,它会得到一个“足够好”的执行计划,否则它可能会花费更多时间来获得最佳执行计划而不是实际完成查询。因此,当它建议一个索引时,它建议它用于比它生成的足够好的计划。查看查询并据此选择索引。如果您刚开始使用索引管理,请先查看连接和 where 子句,然后在测试服务器上试一试,看看哪个最好。

您是否知道为什么我会遇到这些性能问题(以及 不同的执行计划)只是有时?

Kinda 在我的第一个答案中解释了这一点,当您获得不同的执行计划时,您是否正在运行相同的查询?每个不同的查询都会生成一个不同的执行计划,即使在查询末尾添加一个额外的空格也会生成一个新的。

【讨论】: