การแทรกดัชนีแบบไม่รวมกลุ่ม


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

@JNK แต่ถ้าฉันทำselect * from SomeTable where String1 = 'foo'แล้วฉันเห็นว่าจริง ๆ แล้วเครื่องมือเพิ่มประสิทธิภาพการสืบค้นจะเลือกดัชนีIX_SomeString1สำหรับการค้นหาดัชนี ดังนั้นจะต้องมีการอัพเดทดัชนีนั้นเหรอ?

1
คุณสามารถดูสถิติของมันและดู อาจเป็นข้อบกพร่องในการแสดงแผนปฏิบัติการเช่นกัน คุณตรวจสอบ xml แล้วหรือยัง
JNK

1
SQL Server สามารถใช้แผนแบบกว้างหรือแบบแคบขึ้นอยู่กับจำนวนแถวที่ได้รับผลกระทบ สิ่งนี้จะควบคุมว่าการดำเนินการบำรุงรักษาดัชนีจะเกิดขึ้นแยกกันหรือไม่และจะแสดงในแผนเป็นการดำเนินการแยกกันหรือรวมกันและแสดงเป็นส่วนหนึ่งของการดำเนินการ CI
Martin Smith

1
@ MartinSmith คำอธิบายที่ดีและฉันไม่รู้ ขอบคุณสำหรับลิงค์และแสดงความคิดเห็น ฉันเชื่อว่าควรจะเป็นคำตอบ

คำตอบ:


9

สำหรับการแทรกแถวเดียวคุณจะได้รับแผนแคบ / ต่อแถว

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

แผนแคบ

หากคุณเลือกตัวดำเนินการแทรกดัชนีแบบกลุ่มและดูคุณสมบัติของหน้าต่างคุณสามารถดูข้อมูลเดียวกับที่แสดงใน XML

หน้าต่างคุณสมบัติ

ถ้าคุณลอง 1,000 แถว

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

คุณจะได้แผนแบบกว้าง / ต่อดัชนีที่แตกต่างกันโดยแยกการดำเนินการออกจากกัน

แผนกว้าง

ดูWide กับ Narrow Plansหรือบล็อกของ 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

ความคิดเห็น 'newb' ของฉันไม่ได้เกี่ยวกับทักษะของผู้ชมเป็นเรื่องเกี่ยวกับประสบการณ์: ผู้ที่ถูกเผาโดย 'ละเว้น' ของแผนการกราฟิกรู้ดีกว่าที่จะไว้วางใจ นี้ใช้มากยิ่งขึ้นเพื่อที่จะกราฟการหยุดชะงัก
Remus Rusanu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.