簡體   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