SQL Server执行计划建议创建NONClustered索引

时间:2018-05-23 18:06:49

标签: sql sql-server

以下是我创建的以下查询,运行大约需要38秒。

SELECT 
    PartNo, 
    SerialNo, 
    HeciCode, 
    ScanDate, 
    OrderType, 
    PoNo,  
    po.IssueDate, 
    SoNo 
FROM ScanHistory sh WITH (NOLOCK) 
LEFT OUTER JOIN trkRWPOHeader po WITH (NOLOCK) 
    ON sh.PoNo = po.PONum 
WHERE len(PoNo) > 2 
    AND ScanDate > '1/1/2009' 
    AND PartNo = 'RDH102472' 
    AND sh.SerialNo NOT IN (SELECT SerialNo 
                            FROM ScanHistory WITH (NOLOCK) 
                            WHERE PONo = '' 
                                OR (OrderType = 'SO' AND SoNo = '000001') 
                            ) 
    AND sh.SerialNo NOT IN (SELECT i.SerialNo       
                            FROM skp_SkidItem i with (nolock) 
                            INNER JOIN skp_Skid sk with (nolock) 
                                ON i.SkidNo = sk.SkidNo 
                            WHERE sk.SkidStatus = 'Shipped' 
                                or i.ItemStatus = 'Shipped'
                            ) 
ORDER BY PoNo

在Sql Server Activity监视器的Recent Expensive Queries部分下,它向我显示了执行计划,其中包含以下建议(或问题):

Missing Index (Impact 51.4221): CREATE NONCLUSTERED INDEX [<name of missing index, sysname,>] ON dbo.ScanHistory (PartNo, ScanDate)

我的问题是:

如何根据我的查询创建此非聚集索引?

我在Sql Server中编写了几个复杂的查询,但实际上还没有深入研究非聚簇索引。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

  1. SSMS提供的推荐索引并不总是最好的。

  2. 如果这是在工作中,或者如果这是个人项目,请在未经DBA批准的情况下制作索引,在部署之前研究索引。它们不是免费的,它们会影响您的环境,并且需要进行维护。

  3. 要创建特定的建议查询,请启用SSMS中的包含实际执行计划,运行该查询,切换到执行计划选项卡,建议的缺失索引应为绿色文本,右键单击,编写脚本到新窗口,给它一个唯一的名称,然后执行查询。

  4. 如果您提供的消息是您要制作的索引,请删除第一部分并重命名:

    CREATE NONCLUSTERED INDEX [ix_your_unique_name_here] 
        ON dbo.ScanHistory (PartNo, ScanDate)