繁体   English   中英

UNIQUE NONCLUSTERED INDEX和NONCLUSTERED INDEX之间有什么区别吗

[英]Does any different between UNIQUE NONCLUSTERED INDEX and NONCLUSTERED INDEX

我正在使用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]
)

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

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

除了一个明显的差异(一个实施唯一性,另一个不实施唯一性)之外,还有另一个很大的差异。

您的第一个索引:

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

...是过滤索引 (请注意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条件不能从筛选索引中受益,因为索引不包括logID IS NULL行。 因此,它自然建议一个新的索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM