Kümelenmemiş Dizin Ekleme


10

Diyorum ki böyle bir tablo var:

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

Eğer bunu yapacaksam:

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

Ve gerçek yürütme planını görmek, sadece bir Kümelenmiş Dizin Ekleme görüyorum . Yürütme planında neden Kümelenmemiş bir dizin eki görmüyorum ?


Tahmin ediyorum, çünkü belli bir kardinalite ve sıra sayımı eşiğine ulaşana kadar, kümelenmemiş endeksteki istatistikleri tutmaya değmez. Bir tabloda tek bir satır varsa, optimize edici bu dizini kullanmayacağını ve dolayısıyla bunu sürdürmeyeceğini bilir.
JNK

@JNK Ama bir yaparsam select * from SomeTable where String1 = 'foo', o zaman sorgu optimizer aslında IX_SomeString1bir dizin arama için dizin seçin görüyorum . Yani bu dizini güncelliyor olmalı, değil mi?

1
Bunun istatistiklerine bakabilir ve görebilirsiniz. Yürütme planı ekranında da bir eksiklik olabilir. XML'i kontrol ettiniz mi?
JNK

1
SQL Server , etkilenen satır sayısına bağlı olarak geniş veya dar bir plan kullanabilir . Bu, dizin bakım işlemlerinin ayrı ayrı gerçekleşip gerçekleşmediğini ve planda ayrı işlemler olarak mı yoksa birlikte mi gösterileceğini ve CI işleminin bir parçası olarak gösterilip gösterilmeyeceğini denetler.
Martin Smith

1
@MartinSmith Harika bir açıklama ve bunu bilmiyordum. Bağlantı ve yorum için teşekkürler. Bunun bir cevap olması gerektiğine inanıyorum.

Yanıtlar:


9

Tek sıralı bir ekleme için dar / satır başına bir plan alırsınız

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

Dar plan

Kümelenmiş Dizin Ekleme İşleci'ni seçip Özellikler penceresini görüntülerseniz, XML'de gösterilen bilgilerin aynısını görebilirsiniz.

Özellikler Penceresi

1.000 satır denerseniz

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

İşlemler ayrı ayrı bölündüğünde farklı bir geniş / dizin başına plan elde edersiniz

Geniş Plan

Bkz Geniş vs Dar Planları veya Craig Freedman blog iki hakkında daha fazla bilgi için


6

Grafiksel plan görüntüsüne asla güvenmeyin, sadece yeni başlayanlar içindir. Artıları her zaman XML'e bakar. NC operasyonu tam orada:

<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
Uzun zamandır "sadece yeni başlayanlar için" demezdim.
Dave Markle

Benim 'yeni' yorumum izleyicinin becerisi ile ilgili değil, deneyimle ilgili: grafik planların liberal 'ihmalleri' tarafından yakılanlar, ona güvenmekten daha iyi biliyorlar. Bu, kilitlenme grafikleri için daha da geçerlidir .
Remus Rusanu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.