![](/img/trans.png)
[英]Composite clustered index and non clustered index in sql server 2005
[英]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'
需要對MessengerId
和Filename
進行索引相等查找,並且不需要其他列,因此您當前的索引就足夠了。
您同樣可以為相同的結果切換列順序(如果沒有匹配項,您可能會發現它會快一點)
CREATE UNIQUE NONCLUSTERED INDEX [IX_Files_CourierId_FileName] ON [dbo].[Files]
(
[FileName] ASC,
[MessengerId] ASC
)
但是,您建議的另外兩個新索引不涵蓋該查詢,因此服務器很可能甚至不會費心使用它們,尤其是在您現有的查詢仍然存在的情況下。 當然,如果使用它們會更慢,因為它們需要對聚集索引進行鍵查找。
由於其他查詢進行更新,您的實際超時問題更可能與鎖定有關。 我建議您使用查詢來查找任何可能的阻止程序,例如這個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.