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

som*_*omu 8 index sql-server execution-plan

在查看实际执行计划时,即使查询不到 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
Run Code Online (Sandbox Code Playgroud)

执行计划显示:

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

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

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

Ken*_*her 15

您现在不需要添加索引。所有“缺少索引”消息意味着这可能会有所帮助。它可能不诚实,或者可能有一个索引更有帮助。

至于什么时候需要添加新索引?好吧,假设您在 account 表中有 100 行,但它还没有真正被使用。几个月后,您将有多达 10,000 行,而查询现在需要半小时或更长时间。那时您可能会考虑添加索引。当我说考虑时,我的意思是在测试环境中对其进行测试,看看它是否真的有所改进。

其他考虑因素包括:

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