如果我更新表中的列记录,不包含该列的索引会受到影响吗?

Pro*_*eur 5 performance index sql-server-2008 sql-server-2008-r2 nonclustered-index

在性能方面,如果我有这样的表:

CREATE TABLE [TESTDATA].[TableA](
    [Col1] [nchar](5) NOT NULL,
    [Col2] [nchar](2) NULL,
    [Col3] [float] NULL
CONSTRAINT [TableA_PK] PRIMARY KEY CLUSTERED 
(
    [Col1] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

然后像这样创建一个非聚集索引:

CREATE NONCLUSTERED INDEX [_idx_TableA]
ON [TESTDATA].[TableA] ([Col2])
WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

如果我对表执行更新,只有更改Col3数据库才需要触摸索引_idx_TableA吗?

只是好奇性能对所有索引的影响有多大?

Tho*_*ger 7

不,_idx_TableA不会受到此操作的影响。我修改了您的示例并添加了另一个索引 (NCI),它实际上包含了 key column Col3。这是我的示例代码:

use testdb;
go

CREATE TABLE [DBO].[TableA](
    [Col1] [nchar](5) NOT NULL,
    [Col2] [nchar](2) NULL,
    [Col3] [int] NULL
CONSTRAINT [TableA_PK] PRIMARY KEY CLUSTERED 
(
    [Col1] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [_idx_TableA]
ON [DBO].[TableA] ([Col2])
WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
GO

create nonclustered index IX_Col3
on dbo.TableA(Col3);
go

insert into dbo.TableA
values
    ('a', 'b', 10),
    ('b', 'c', 11),
    ('c', 'd', 12);
go

update dbo.TableA
set Col3 = 13;
Run Code Online (Sandbox Code Playgroud)

如果我捕获UPDATE命令的执行后计划,您将在此处看到类似的内容:

在此处输入图片说明

从上面的截图中可以看出,更新的索引是聚集索引和我的非聚集索引IX_Col3索引_idx_TableA不会更新。因此,只有包含的索引Col3会受到影响,因此由您的特定示例更新。