Masukkan Indeks Nonclustered

10

Katakanlah saya punya tabel seperti ini:

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

Jika saya melakukan ini:

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

Dan melihat rencana eksekusi yang sebenarnya, saya hanya melihat Insert Indeks Clustered . Mengapa saya tidak melihat Sisipan Indeks Tidak Tertutup dalam rencana eksekusi?


sumber
Saya menduga karena sampai Anda mencapai kardinalitas dan ambang jumlah baris tertentu, tidak ada gunanya mempertahankan statistik pada indeks yang tidak tercakup. Jika Anda memiliki satu baris dalam sebuah tabel, pengoptimal tahu itu tidak akan menggunakan indeks itu sehingga tidak mempertahankannya.
JNK
@ JNK Tetapi jika saya melakukan select * from SomeTable where String1 = 'foo', maka saya melihat bahwa pengoptimal permintaan sebenarnya memilih indeks IX_SomeString1untuk pencarian indeks. Jadi itu harus memperbarui indeks itu, bukan?
1
Anda dapat melihat statistik untuk itu dan melihatnya. Mungkin ada kekurangan dalam tampilan rencana eksekusi juga. Sudahkah Anda memeriksa xml?
JNK
1
SQL Server dapat menggunakan rencana lebar atau sempit tergantung pada berapa banyak baris yang terpengaruh. Ini mengontrol apakah operasi pemeliharaan indeks terjadi secara terpisah dan ditampilkan dalam rencana sebagai operasi terpisah atau bersama-sama dan ditampilkan sebagai bagian dari operasi CI.
Martin Smith
1
@ MartinSmith Penjelasan yang bagus dan saya tidak tahu itu. Terima kasih atas tautan dan komentarnya. Itu harus menjadi jawaban, saya percaya.

Jawaban:

9

Untuk memasukkan satu baris Anda mendapatkan paket yang sempit / per baris

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

Rencana sempit

Jika Anda memilih Operator Penyisipan Indeks Berkelompok dan Lihat jendela properti Anda dapat melihat informasi yang sama seperti yang ditunjukkan dalam XML.

Jendela Properti

Jika Anda mencoba untuk 1.000 baris

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

Anda mendapatkan rencana lebar / per-indeks yang berbeda dengan operasi yang dibagi secara terpisah

Rencana Lebar

Lihat Wide vs. Narrow Plans atau blog Craig Freedman untuk informasi lebih lanjut tentang keduanya

Martin Smith
sumber
6

Jangan pernah mempercayai tampilan rencana grafis, hanya untuk pemula. Pro selalu melihat XML. Operasi NC ada di sana:

<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" />
Remus Rusanu
sumber
5
Saya tidak akan mengatakan itu hanya untuk pemula saja.
Dave Markle
Komentar 'newb' saya bukan tentang keterampilan pemirsa, melainkan tentang pengalaman: mereka yang telah dibakar oleh 'kelalaian' liberal dari rencana grafis lebih tahu daripada memercayainya. Ini berlaku bahkan lebih untuk grafik jalan buntu .
Remus Rusanu