[英]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.