Khi nào cần thêm chỉ mục vào các bảng #temp?


8

Khi kiểm tra các thủ tục được lưu trữ trong SSMS, đôi khi nó nói rằng có một chỉ mục bị thiếu trên #someTempTable____________________000000000000005B] (someField)vv

Khi tôi thêm chúng như thế này vào sp:

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[#someTable] ([someField])
GO

Tôi dường như không bao giờ thấy một sự cải thiện tốc độ. Vì vậy, tôi thường không thêm các chỉ mục như vậy. Khi nào tôi nên thêm các chỉ mục như vậy?

Câu trả lời:


12

Thêm một chỉ mục nếu bạn sẽ sử dụng bảng tạm thời và chỉ mục của nó hai lần trở lên trong quá trình chạy truy vấn.

Hoặc để duy trì các tác vụ chỉ mục thông thường, như tính duy nhất

Nếu dữ liệu của bạn được tải vào bảng tạm thời đã được sắp xếp, thì bảng tạo tạm thời có cùng chỉ mục được phân cụm như sắp xếp dữ liệu

NHƯNG

tính đến tính năng của máy chủ sql sử dụng lại các bảng tạm thời - nếu bạn quyết định tạo một chỉ mục trên bảng tạm thời - hãy thử thực hiện nó trong câu lệnh CREATE TABLE. Nếu bạn sẽ thêm một chỉ mục rõ ràng sau khi tạo bảng - nó sẽ ngăn máy chủ sql sử dụng lại bảng đó vào lần tới


Bạn không thể thêm một chỉ mục trong câu lệnh CREATE TABLE. Chỉ có các ràng buộc có thể được thêm vào đó.
Erik Dekker

@ErikDekker Tạo một số ràng buộc có nghĩa là cũng tạo các chỉ mục
Oleg Dok

Tôi biết. Nhưng câu hỏi là về việc thêm một chỉ mục không bao gồm. Điều đó không thể được thực hiện trực tiếp trong tuyên bố tạo ;-)
Erik Dekker

@ErikDekker Bạn có thể chỉ định loại chỉ mục nào sẽ được tạo cho ràng buộc
Oleg Dok

5

Điều này thật khó để trả lời nếu không có nhiều thông tin hơn. Nói chung, tôi sẽ nói, "nó phụ thuộc".

Nói chung, tôi thêm chỉ mục vào bảng tạm thời nếu lợi ích của chỉ mục lớn hơn chi phí thực hiện ban đầu cộng với chi phí tạo chỉ mục. Bạn sẽ phải làm một điểm chuẩn bằng cách sử dụng SET STATISTICS IO làm ví dụ. Tôi cũng muốn xem lại các kế hoạch thực hiện được sử dụng trước và sau khi chỉ mục được thêm vào. Đôi khi các chỉ mục được đề xuất không thực sự là các chỉ mục được đề xuất :-)


Loại thông tin nào bạn muốn đề nghị tôi thêm vào câu hỏi của mình để làm cho nó hữu ích hơn?
OO

Một ví dụ về việc sử dụng bảng tạm thời của bạn sẽ hữu ích. Làm thế nào thường được thực hiện? Tần suất bạn sẽ đọc từ bảng tạm thời địa phương? Tôi cũng muốn xem các logic đọc, ghi, các kế hoạch thực hiện cho mã. Nếu bạn có một đường cơ sở của trước và sau này sẽ cho bạn biết nếu chỉ số này thực sự hữu ích.
JohnS

Tôi không chắc chắn làm thế nào để làm tất cả những điều đó, nhưng tôi có thể bắt đầu bằng cách đăng kế hoạch giải thích thực tế của thủ tục được lưu trữ sử dụng các bảng tạm thời không được lập chỉ mục, nếu bạn nghĩ rằng điều đó sẽ hữu ích?
OO

Chắc chắn, hãy cho nó đi. Đây cũng là một liên kết để cho bạn thấy cách hoạt động của STATISTICS. Bạn có thể chạy cái này chống lại một hộp phát triển không? Bạn sẽ muốn đánh giá cả hai kịch bản có và không có chỉ mục mới. Bạn cũng sẽ muốn kéo kế hoạch thực hiện cho cả hai lần thực hiện.
JohnS

Hiểu. Làm thế nào tôi nên dán kế hoạch giải thích? Là XML?
OO

3

Do thực tế là bảng tạm thời mà bạn chỉ ra có phạm vi cục bộ (như được biểu thị bằng một dấu đơn), nói chung, không tốt nhất để thêm một chỉ mục vì bảng sẽ chỉ tồn tại trong suốt thời gian kết nối.


Ngay cả khi nó được sử dụng nhiều lần trong, giả sử, một quy trình được lưu trữ hơn 2000 dòng?
OO

Chắc chắn - Tôi đã sử dụng chúng trước đây trong các procs được lưu trữ ở kích thước đó một cách dễ dàng. Miễn là không có gợi ý truy vấn, trình tối ưu hóa sẽ có thể bù.
OliverAsmus

1

bạn nên cập nhật số liệu thống kê sau khi có thay đổi lớn trong bảng, ví dụ: tạo tempTable, thêm chỉ mục, chèn bản ghi 10k ... CẬP NHẬT THỐNG KÊ.

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.