UNIQUE NONCLUSTERED INDEX和NONCLUSTERED INDEX

时间:2015-10-02 17:37:33

标签: sql indexing sql-server-2008-r2 sql-execution-plan

我使用的是SQL Server 2008 R2,我的数据库中的索引已经创建:

CREATE UNIQUE NONCLUSTERED INDEX IndexT1 
ON T1 (
    [ID] ASC,
    [logID] ASC
)
INCLUDE ([MasterID]) 
WHERE ([logID] IS NOT NULL)

我执行了这个查询:

SELECT 
    R.X 
FROM
    R
LEFT JOIN 
    T1 ON T1.MasterID = R.MasterID
WHERE 
    T1.ID IS NULL 
    AND R.logID IS NULL
    AND T1.ItemID IN (SELECT MAX(R.ItemID)
                      FROM R
                      LEFT JOIN T1 ON T1.MasterID = R.MasterID
                      WHERE T1.ID IS NULL 
                        AND R.logID IS NULL
                      GROUP BY R.MasterID)  

在执行计划中,SQL Server为我提供了创建此索引的信息:

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON T1 (
  [ID],
  [logID]
)

有人知道这些索引之间有什么区别吗?

因为,我认为第一个涵盖第二个!为什么我的查询不能使用第一个?

1 个答案:

答案 0 :(得分:1)

除了一个人强制执行唯一性而另一个人没有明显区别之外,还有另一个很大的区别。

你的第一个索引:

CREATE UNIQUE NONCLUSTERED INDEX IndexT1 
ON T1 (
    [ID] ASC,
    [logID] ASC
)
INCLUDE ( [MasterID]) 
WHERE ([logID] IS NOT NULL) -- notice the WHERE clause here!

...是filtered index(注意where子句。)

另一方面,你的第二个指数:

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON T1 (
  [ID],
  [logID]
)

......不是。

这意味着您的过滤索引 包含logID IS NULL行,因此只强制ID/logID组合的唯一性如果logID IS NOT NULL

这里的要点是SQL Server注意到您的查询包含logID IS NULL上无法从过滤索引中受益的条件,因为索引不包含logID IS NULL行。所以它自然地暗示了一个新的指数。