Sql-Server

有沒有辦法為 UNIQUE NONCLUSTERED 索引添加 INCLUDE?

  • March 13, 2022

我們有一個有 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,則需要創建CONSTRAINTas a UNIQUE 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。我不會認為這是一筆可觀的成本。

我的意思是,在您嘗試修復它之前,請確保您在這裡遇到了“真正的問題”。

引用自:https://dba.stackexchange.com/questions/308624