非クラスター化インデックスの挿入


10

次のようなテーブルがあるとします。

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

私がこれをするなら:

insert into SomeTable(SomeString1, SomeString2)
values('foo', 'bar')
go

実際の実行計画を表示すると、クラスター化インデックスの挿入しか表示されません。実行プランに非クラスター化インデックスの挿入が表示されないのはなぜですか?


特定のカーディナリティと行数のしきい値に達するまで、非クラスター化インデックスの統計を維持することは価値がないためだと思います。テーブルに単一の行がある場合、オプティマイザはそのインデックスを使用しないことを認識しているため、維持されません。
JNK 2012年

@JNKしかし、を実行するselect * from SomeTable where String1 = 'foo'と、クエリオプティマイザが実際にIX_SomeString1インデックスシークのインデックスを選択することがわかります。ですから、そのインデックスを更新している必要がありますか?

1
あなたはそれの統計を見て、見ることができます。実行計画の表示も欠点かもしれません。xmlを確認しましたか?
JNK 2012年

1
SQL Serverでは影響を受ける行の数に応じて、幅の広いプランまたは幅の狭いプランを使用できます。これは、インデックスメンテナンス操作が個別に発生し、プランに個別の操作として表示されるか、一緒にCI操作の一部として表示されるかを制御します。
マーティン・スミス

1
@MartinSmith素晴らしい説明と私はそれを知りませんでした。リンクとコメントをありがとう。それが答えになるはずだと思います。

回答:


9

単一行の挿入の場合、狭い/行ごとの計画を取得します

INSERT INTO SomeTable(SomeString1, SomeString2)
SELECT TOP 1 type, type
FROM master..spt_values

狭い計画

Clustered Index Insert演算子を選択してプロパティウィンドウを表示すると、XMLに示されているのと同じ情報を確認できます。

プロパティウィンドウ

1,000行を試した場合

INSERT INTO SomeTable(SomeString1, SomeString2)
SELECT TOP 1000 type, type
FROM master..spt_values

操作が個別に分割されているため、異なるワイド/インデックスごとのプランを取得します

ワイドプラン

2つの詳細については、ワイドプランとナロープラン、またはCraig Freedmanのブログを参照してください。


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" />

5
長い目で見れば「初心者向け」とは言えない。
Dave Markle、2012年

私の「新人」のコメントは、視聴者のスキルではなく、経験に関するものです。グラフィカルな計画のリベラルな「省略」に火傷した人は、それを信頼するよりもよく知っています。これはデッドロックグラフにも当てはまります
Remus Rusanu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.