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
吗?
只是好奇性能对所有索引的影响有多大?
不,_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
会受到影响,因此由您的特定示例更新。