Chèn chỉ mục không bao gồm


10

Nói rằng tôi có một bảng như thế này:

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

Nếu tôi phải làm điều này:

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

Và xem kế hoạch thực hiện thực tế, tôi chỉ thấy một Chèn chỉ mục cụm . Tại sao tôi không thấy Chỉ mục không được chèn trong kế hoạch thực hiện?


Tôi đoán bởi vì cho đến khi bạn đạt một ngưỡng số lượng và số lượng hàng nhất định, sẽ không đáng để duy trì các số liệu thống kê về chỉ số không bao gồm. Nếu bạn có một hàng trong một bảng, trình tối ưu hóa sẽ biết rằng nó sẽ không sử dụng chỉ mục đó nên sẽ không duy trì nó.
JNK

@JNK Nhưng nếu tôi làm a select * from SomeTable where String1 = 'foo', thì tôi thấy rằng trình tối ưu hóa truy vấn thực tế chọn chỉ mục IX_SomeString1cho tìm kiếm chỉ mục. Vì vậy, nó phải được cập nhật chỉ số đó, không?

1
Bạn có thể nhìn vào số liệu thống kê cho nó và xem. Nó cũng có thể là một thiếu sót trong màn hình kế hoạch thực hiện. Bạn đã kiểm tra xml chưa?
JNK

1
SQL Server có thể sử dụng một kế hoạch rộng hoặc hẹp tùy thuộc vào số lượng hàng bị ảnh hưởng. Điều này kiểm soát xem các hoạt động bảo trì chỉ mục có xảy ra riêng biệt và được hiển thị trong kế hoạch dưới dạng các hoạt động riêng biệt hoặc cùng nhau và hiển thị như một phần của hoạt động CI.
Martin Smith

1
@MartinSmith Giải thích tuyệt vời và tôi không biết điều đó. Cảm ơn các liên kết và bình luận. Đó nên là một câu trả lời, tôi tin.

Câu trả lời:


9

Đối với một hàng chèn, bạn có một gói hẹp / mỗi hàng

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

Kế hoạch hẹp

Nếu bạn chọn Toán tử chèn chỉ mục cụm và xem cửa sổ thuộc tính, bạn có thể thấy thông tin tương tự như được hiển thị trong XML.

Cửa sổ thuộc tính

Nếu bạn cố gắng cho 1.000 hàng

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

Bạn nhận được một gói rộng / mỗi chỉ mục khác nhau với các thao tác được tách riêng

Kế hoạch rộng

Xem các kế hoạch rộng so với thu hẹp hoặc blog của Craig Freedman để biết thêm thông tin về hai


6

Không bao giờ tin tưởng hiển thị kế hoạch đồ họa, chỉ dành cho người mới. Ưu điểm luôn luôn nhìn vào XML. Hoạt động NC ở ngay đó:

<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
Tôi sẽ không nói đó là "chỉ dành cho người mới" trong một khoảng thời gian dài.
Dave Markle

Nhận xét 'newb' của tôi không phải là về kỹ năng của người xem, là về trải nghiệm: những người đã bị đốt cháy bởi 'thiếu sót' của các kế hoạch đồ họa biết rõ hơn là tin tưởng vào nó. Điều này thậm chí còn áp dụng nhiều hơn cho các biểu đồ bế tắc .
Remus Rusanu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.