有时候(并不总是!)我遇到了性能问题。 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)
如果您需要更多信息,请告诉我
答案 0 :(得分:1)
为什么我有时会得到丢失的索引消息,有时却没有 当我的指定表的索引没有改变?
这完全取决于正在运行的查询,如果SQL引擎认为索引会帮助它选择完成该查询的计划,那么它会告诉您。
注意:这些并不总是最好的!
引擎无法生成最好的"执行计划,它得到一个足够好的"否则它可能花费更多的时间来获得最好的而不是实际完成查询。因此,当它建议一个指数时,它建议的是足够好的计划而不是它产生的。查看查询并根据该选择选择索引。如果你开始使用索引管理首先查看联接和where子句,请在测试服务器上进行操作,看看哪个最好。
你有任何想法,为什么我有这些性能问题(和 不同的执行计划)有时候?
有点在我的第一个答案中解释了这一点,当你得到不同的执行计划时,你运行相同的查询吗?每个不同的查询都会生成一个不同的执行计划,即使在查询结尾添加额外的空格也会生成一个新的空格。