簡體   English   中英

在 Microsoft SQL 服務器中,當已經有一個非聚集復合索引時,2 個非聚集索引會提高性能嗎?

[英]In Microsoft SQL Server, will 2 non clustered indices improve performance when there is already a non clustered composite index?

我有一個名為 Files 的表,其中包含這些列

[Id] [int] IDENTITY(1,1) NOT NULL,
[RowVersion] [timestamp] NULL,
[CreatedAt] [datetime2](7) NOT NULL,
[UpdatedAt] [datetime2](7) NOT NULL,
[FileName] [nvarchar](450) NOT NULL,
[FileContent] [nvarchar](max) NULL,
[MessengerId] [int] NOT NULL,
[FileTypeId] [int] NOT NULL,
[Ref] [int] NOT NULL,

該表在主鍵 Id 上有一個聚集索引。

MessengerId 和 FileName 上還有一個非聚集復合索引

CREATE UNIQUE NONCLUSTERED INDEX [IX_Files_CourierId_FileName] ON [dbo].[Files]
(
    [MessengerId] ASC,
    [FileName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

這個查詢很慢

SELECT COUNT(*) FROM Files WHERE MessengerId = 1 AND Filename = 'myfilename.xml'

我正在努力測試,因為超時發生在生產服務器上。 在我的開發者筆記本電腦上,我沒有任何問題。

在 MessengerId 和 Filename 上添加 2 個新索引會提高性能嗎?

2個新指數看起來像這樣

CREATE NONCLUSTERED INDEX [Index_on_FileName] ON [dbo].[Files]
(
    [FileName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [Index_on_MessengerId] ON [dbo].[Files]
(
    [MessengerId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO

這個查詢

SELECT COUNT(*) FROM Files WHERE MessengerId = 1 AND Filename = 'myfilename.xml'

需要對MessengerIdFilename進行索引相等查找,並且不需要其他列,因此您當前的索引就足夠了。

您同樣可以為相同的結果切換列順序(如果沒有匹配項,您可能會發現它會一點)

CREATE UNIQUE NONCLUSTERED INDEX [IX_Files_CourierId_FileName] ON [dbo].[Files]
(
    [FileName] ASC,
    [MessengerId] ASC
)

但是,您建議的另外兩個新索引不涵蓋該查詢,因此服務器很可能甚至不會費心使用它們,尤其是在您現有的查詢仍然存在的情況下。 當然,如果使用它們會更慢,因為它們需要對聚集索引進行鍵查找。


由於其他查詢進行更新,您的實際超時問題更可能與鎖定有關。 我建議您使用查詢來查找任何可能的阻止程序,例如這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM