SQL Server - 有时糟糕的性能和缺失的索引提示 - 为什么?

时间:2017-09-04 08:36:11

标签: sql sql-server performance indexing

有时候(并不总是!)我遇到了性能问题。 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个单独的índexes(4个非群集,1个clusted)

如果您需要更多信息,请告诉我

1 个答案:

答案 0 :(得分:1)

  

为什么我有时会得到丢失的索引消息,有时却没有   当我的指定表的索引没有改变?

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

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

引擎无法生成最好的"执行计划,它得到一个足够好的"否则它可能花费更多的时间来获得最好的而不是实际完成查询。因此,当它建议一个指数时,它建议的是足够好的计划而不是它产生的。查看查询并根据该选择选择索引。如果你开始使用索引管理首先查看联接和where子句,请在测试服务器上进行操作,看看哪个最好。

  

你有任何想法,为什么我有这些性能问题(和   不同的执行计划)有时候?

有点在我的第一个答案中解释了这一点,当你得到不同的执行计划时,你运行相同的查询吗?每个不同的查询都会生成一个不同的执行计划,即使在查询结尾添加额外的空格也会生成一个新的空格。