我在名爲Shopper
的表上有兩個索引。儘管有聚簇索引,SQL Server仍在使用非聚簇索引
聚集索引:
CREATE CLUSTERED INDEX [CI_EMail_ShopperNumID]
ON [dbo].[Shopper] ([EMail] ASC, [ShopperNumID] ASC)
非聚集索引
CREATE NONCLUSTERED INDEX [nci_wi_Shopper_D8E9A1BB0660D0838F923BB8587C7115]
ON [dbo].[Shopper] ([EMail] ASC)
INCLUDE ([DateCreated], [FirstName], [LastLoginDate], [LastName],
[MaxEmailVolume], [ShopperNumID], [ShopperSourceCD], [ShopperSourceOther])
我運行一個非常簡單的SELECT
:
SELECT ShopperNumID
FROM shopper
WHERE Email = '[email protected]'
在分析執行計劃,我注意到,非正在使用聚簇索引:
現在,我把非聚集索引:
DROP INDEX IF EXISTS [nci_wi_Shopper_D8E9A1BB0660D0838F923BB8587C7115]
ON [dbo].[Shopper]
GO
並重新運行我的選擇注意到,聚簇索引(最終)使用
有人可以解釋爲什麼(龐大的)非聚集索引被優化引擎使用,而不是(首選)聚集索引?
的Microsoft SQL Server 2016(RTM-GDR)(KB3194716) - 在Windows 10 13.0.1722.0(X64)
開發版(64位)專業版6.3(建設14393 :)
UPDATE: 基於收到的輸入,爲了進一步評估,我在表上創建了另一個非聚集索引,與已有的聚集索引非常相似。
CREATE NONCLUSTERED INDEX [NCI_EMail_ShopperNumID]
ON [dbo].[Shopper] ([EMail] ASC, [ShopperNumID] ASC)
目前,該表有3個指標,能夠支持我的SELECT
:
- 聚集索引[CI_EMail_ShopperNumID]
- 非聚集索引[nci_wi_Shopper_D8E9A1BB0660D0838F923BB8587C7115]
- 非聚集索引[NCI_EMail_ShopperNumID]
現在,當我運行s AME SELECT
:
SELECT ShopperNumID
FROM shopper
WHERE Email = '[email protected]'
好像優化是堅定的關於使用非聚集索引,不管怎樣!
聚集索引不是真的索引,它是表本身。因此,它包含所有表格列,索引列僅定義數據存儲的排序順序。 –
你的NONCLUSTERED覆蓋索引的用例是什麼?由於它只包含[email]列,並假定它存儲在同一個文件組中,所以在CLUSTERED索引上的性能沒有提高。 – uhleeka
我很好奇 - 哪一個實際上更快? (清除緩存後)。 「SET STATISTICS IO」是否顯示任何特別不同的輸出? –