执行计划显示缺少索引但查询很快


8

在查看实际的执行计划时,即使查询所用的时间少于1秒,它也会显示缺少的索引。

SELECT
    Account.AccountID,
    Account.Name
FROM
    account      
    LEFT OUTER JOIN accountfeaturesetting afs 
ON afs.accountid = account.accountid   
and afs.featureid = 'Schedules'
 and  
afs.settingid = 'EditReasons'           
WHERE
    ISNULL(afs.Value, '0') = '0'  
    AND EXISTS 
(SELECT 1 FROM program WHERE program.AccountID = account.AccountID
 AND program.Active = 1 
AND (program.ScheduleEditReasonFlags <> 0 
OR program.ScheduleEditReasonFields <> 0))
    AND account.IsMaster = 0
    AND account.BeginDate IS NOT NULL

执行计划显示:

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Account] ([IsMaster],[BeginDate])
INCLUDE ([AccountID],[Name])

即使查询仅花费1秒,我们是否仍需要创建索引?应该在什么基础上创建索引?

我将把此查询作为日常工作来运行。


1
一秒钟够快吗?
埃里克·达林

不到1秒的时间
索姆(Somu)2017年

4
好吧...够快了吗?
Erik Darling

我认为它的速度非常快,因为帐户表有900行。帐户功能设置有21385行
索马尔

1
我想说的是,比您在测试数据库中实际添加的行多添加100倍,然后发布实际的执行计划。然后在添加此索引后将其重新发布,您将看到并了解为什么其他人会推荐或不应用此索引。
马吉尔

Answers:


15

您无需立即添加索引。所有“缺少索引”消息意味着这可能会有所帮助。说实话,或者可能有一个索引可以提供更多帮助。

至于何时需要添加新索引?好吧,假设您的帐户表中有100行,但尚未真正使用。在短短的几个月内,您最多可以容纳10,000行,而查询现在需要半小时或更长时间。此时,您可以考虑添加索引。当我说“考虑”时,我的意思是在测试环境中对其进行测试,看看它是否确实可以改善性能。

其他注意事项包括:

  • 该表上已经有多少个索引?如果您有10多个索引,那么与您说2相比,我会更担心。
  • 这个查询有多重要?您说您每天晚上都在运行它。1秒就可以了(假设您只运行一次)。另一方面,如果它是过程的一部分,并且每晚每晚运行1000次,那么问题可能更多。如果要花费足够长的时间导致您出现问题(导致另一个进程出现问题,或者遇到用户进入系统时等),那么您需要查看性能并添加索引。

还值得一问的是,您希望拥有多少个帐户。如果您要订购飞机,您可能没有那么庞大的客户群,但是如果这是一个社交媒体网站,则您的主要目标是尽快使这一数字达到数百万。还有一件事-在某些情况下,我现在倾向于建立索引,这样,一年后由于某种原因而使帐户数量减少时,我就不必去寻找使应用程序变慢的原因。
msouth
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.