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服务器提议我创建这个索引:
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!
...是一个 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 服务器注意到您的查询包含 logID IS NULL
上的条件,这些条件无法从过滤索引中受益,因为索引不包含 logID IS NULL
的行.所以它自然会建议一个新的索引。
我正在使用 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服务器提议我创建这个索引:
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!
...是一个 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 服务器注意到您的查询包含 logID IS NULL
上的条件,这些条件无法从过滤索引中受益,因为索引不包含 logID IS NULL
的行.所以它自然会建议一个新的索引。