非聚集索引插入

10 sql-server

假设我有一张这样的表:

create table SomeTable
(
    id int identity(1, 1) not null primary key clustered,
    SomeString1 varchar(50) not null,
    SomeString2 varchar(50) not null
)
go

create nonclustered index IX_SomeString1
on SomeTable(SomeString1)
go
Run Code Online (Sandbox Code Playgroud)

如果我要这样做:

insert into SomeTable(SomeString1, SomeString2)
values('foo', 'bar')
go
Run Code Online (Sandbox Code Playgroud)

并查看实际执行计划,我只看到一个Clustered Index Insert。为什么我在执行计划中没有看到非聚集索引插入

Mar*_*ith 9

对于单行插入,您会得到一个窄/每行计划

INSERT INTO SomeTable(SomeString1, SomeString2)
SELECT TOP 1 type, type
FROM master..spt_values
Run Code Online (Sandbox Code Playgroud)

狭窄的计划

如果您选择 Clustered Index Insert Operator 并查看属性窗口,您可以看到与 XML 中显示的信息相同的信息。

属性窗口

如果您尝试 1,000 行

INSERT INTO SomeTable(SomeString1, SomeString2)
SELECT TOP 1000 type, type
FROM master..spt_values
Run Code Online (Sandbox Code Playgroud)

您将获得不同的广泛/每个索引计划,并将操作分开

广计划

有关两者的更多信息,请参阅Wide vs. Narrow PlansCraig Freedman 的博客


Rem*_*anu 6

永远不要相信图形计划显示,仅适用于新手。优点总是查看 XML。NC 操作就在那里:

<Update DMLRequestSort="false">
  <Object Database="[testdb]" Schema="[dbo]" Table="[SomeTable]" Index="[PK__SomeTabl__3213E83F4AAF1C98]" IndexKind="Clustered" />
  <Object Database="[testdb]" Schema="[dbo]" Table="[SomeTable]" Index="[IX_SomeString1]" IndexKind="NonClustered" />
Run Code Online (Sandbox Code Playgroud)

  • 我不会长期说它“仅适用于新手”。 (5认同)