Sql-Server
有沒有辦法為 UNIQUE NONCLUSTERED 索引添加 INCLUDE?
我們有一個有 4 列的表(範例):
create TABLE [dbo].[myTable] ( [Id] BIGINT NOT NULL, [Id2] SMALLINT NOT NULL, [Id3] SMALLINT NOT NULL, [IdUnique] UNIQUEIDENTIFIER NOT NULL, [CreateDate] DATETIME NOT NULL, CONSTRAINT [PK_MyTable_Id_Id2_Id3] PRIMARY KEY CLUSTERED ([Id], [Id2], [Id3]), CONSTRAINT [UQ_MyTable_IdUnique] UNIQUE NONCLUSTERED ([IdUnique] ASC ) )
這個想法是在 WHERE 中使用 IdUnique 來檢索 ID、ID2 和 ID3:
但顯然我們正在進行密鑰查找。
如何在唯一非聚集索引上包含包含列?
我找不到與此相關的任何內容。
在約束上添加包含
內聯或獨立創建期間
INCLUDE
不支持An 。CONSTRAINTS
如果您希望CONSTRAINT
擁有一個INCLUDE
,則需要創建CONSTRAINT
as aUNIQUE INDEX
。但是,正如 Paul White 所指出的,直到 SQL Server 2019 才支持使用包含創建內聯索引。在 2019 年之前的 SQL Server 版本上,解決方法是創建
UNIQUE INDEX
一個獨立語句。此外,您的查詢正在使用
SELECT *
,這意味著CreateData
也正在返回。這是實際驅動 Key Lookup 的列。因此,CreateDate
將是您需要包含的列。否則,您只需要明確列出ID
您要選擇的三列。如果CreateDate
要返回,以下索引將幫助您避免 Key Lookup。創建包含 SQL Server 2019 及更高版本的內聯唯一索引
CREATE TABLE [dbo].[myTable2] ( [Id] BIGINT NOT NULL, [Id2] SMALLINT NOT NULL, [Id3] SMALLINT NOT NULL, [IdUnique] UNIQUEIDENTIFIER NOT NULL, [CreateDate] DATETIME NOT NULL, CONSTRAINT [PK_MyTable_Id_Id2_Id3] PRIMARY KEY CLUSTERED ([Id], [Id2], [Id3]), INDEX [UQ_MyTable_IdUnique] UNIQUE NONCLUSTERED ([IdUnique] ASC) INCLUDE (CreateDate) )
在 SQL Server 2019 之前創建包含包含的唯一索引
CREATE UNIQUE NONCLUSTERED INDEX UQ_MyTable_IdUnique ON dbo.myTable (IdUnique) INCLUDE (CreateDate)
大圖
是否有理由擔心這個特定的密鑰查找?一般來說,密鑰查找通常是一件壞事,但這並不意味著每次找到它們時都需要刪除它們。在您的情況下,您正在針對唯一列查詢表。這應該總是最多返回一行。因此,最多只有一個 Key Lookup。我不會認為這是一筆可觀的成本。
我的意思是,在您嘗試修復它之前,請確保您在這裡遇到了“真正的問題”。