2011-12-19 28 views
5

Tôi có các bảng Log và LogItem; Tôi đang viết một truy vấn để lấy một số dữ liệu từ cả hai. Có hàng ngàn Logs và mỗi Log có thể có tối đa 125 LogItemsTại sao tạo chỉ mục mới này cải thiện hiệu suất nhiều khi chỉ mục hiện tại bao gồm tất cả các cột trong chỉ mục mới?

Truy vấn được đề cập phức tạp nên tôi bỏ qua (nếu ai đó cho rằng điều quan trọng là tôi có thể đăng), nhưng khi tôi chạy Truy vấn ước tính SSMS kế hoạch, nó nói với tôi một chỉ số Non-Clustered mới sẽ cải thiện hiệu suất lên đến 100%.

Existing Index: Non-clustered 
Key Colums (LogItem): ParentLogID, DateModified, Name, DatabaseModified 

Query Plan Recommendation 
CREATE NONCLUSTERED INDEX [LogReportIndex] 
ON [dbo].[LogItem] ([ParentLogID],[DatabaseModified]) 

Chỉ để cho vui, tôi đã tạo chỉ mục mới này và chạy truy vấn và nhiều bất ngờ, bây giờ mất ~ 1 giây để truy vấn của tôi chạy, trước khoảng 10 giây.

Tôi cho rằng chỉ mục hiện tại của mình sẽ bao gồm truy vấn mới này, vậy câu hỏi của tôi là tại sao tạo chỉ mục mới trên các cột được sử dụng trong truy vấn mới của tôi để cải thiện hiệu suất? Tôi có nên có chỉ mục cho từng kết hợp cột duy nhất được sử dụng trong các điều khoản where của mình không?

lưu ý: Tôi không nghĩ rằng đây là do SQL Server là bộ nhớ đệm kết quả của tôi, tôi chạy truy vấn khoảng 25-30 lần trước khi tôi tạo ra các chỉ mục và nó consistantly mất 10-15 giây, sau khi chỉ số nó bây giờ là nhất quán ~ 1 hoặc ít hơn.

+0

Trước khi bạn tạo chỉ mục không bổ sung, kế hoạch thực hiện * thực tế * hiển thị cho việc sử dụng chỉ mục là gì? –

+0

Hiệu suất được cải thiện 100% là bao nhiêu? – JeffO

+0

@Shark Câu hỏi hay, tôi không chắc chắn. Đây là tình huống gỡ lỗi hiệu suất đầu tiên của tôi. Tôi chắc chắn sẽ nắm lấy điều đó trong tương lai. Tất cả những gì nó nói là 'Thiếu chỉ mục' và nó nói những trường nào. – Nate

Trả lời

6

Thứ tự các cột trong chỉ mục là quan trọng. Nếu lọc yêu cầu cột 1 và 4 từ chỉ mục, chỉ mục sẽ không giúp ích gì. Nó chỉ hữu ích khi lọc theo N cột liên tiếp đầu tiên.

Điều này là do chỉ mục là một cây. Bạn không thể chọn hiệu quả tất cả các nút của cây nơi column3 = something, bởi vì chúng nằm rải rác khắp nơi khác, thuộc các giá trị khác nhau của column1column2. Nhưng nếu bạn biết column1column2 là tốt, việc xác định nhánh bên phải trong cây là không có trí tuệ.

+0

Sau đó, nó sẽ an toàn để giả định (nói chung) tôi cần một chỉ mục cho mỗi tập hợp các mệnh đề "ở đâu" sẽ nhấn vào bảng đó? – Nate

+0

Tôi đã từng tăng tốc độ truy vấn của người khác chỉ bằng cách đảm bảo rằng nó đã sử dụng chỉ mục theo đúng thứ tự. –

+0

@Nate Rộng, vâng. Một số 'nơi' s có thể chồng chéo lên nhau, vì vậy bạn có thể có một chỉ mục độc đáo bao gồm một số 'where's; hoặc bạn có thể bỏ qua một số phần của mệnh đề 'where' vì việc lập chỉ mục trên một cột nhất định sẽ không giúp ích gì (tính chọn lọc thấp); nhưng rộng rãi, vâng. – GSerg

2

cạnh đầu tiên của chỉ mục là quan trọng.

Miễn là truy vấn của bạn được "bao phủ" bởi một cạnh dẫn đầu của chỉ mục, nó sẽ hiệu quả. Các chỉ mục cơ sở dữ liệu thường được thực hiện như B-Trees và cấu trúc của B-Tree ra lệnh rằng tìm kiếm phải được thực hiện theo một thứ tự nhất định, đó là lý do tại sao thứ tự các trường trong chỉ mục tổng hợp lại quan trọng.

Nếu bạn có "lỗ", ví dụ: nếu bạn tìm kiếm trên ParentLogIDDatabaseModified, nhưng chỉ có chỉ mục trên {ParentLogID, DateModified, Name, DatabaseModified} thì chỉ có thể sử dụng phần {ParentLogID} của chỉ mục một cách hiệu quả.

(LƯU Ý: Một số DBMS có thể sử dụng phần {DatabaseModified} thông qua "bỏ qua quét", nhưng ngay cả khi DBMS của bạn hoạt động kém hiệu quả hơn truy cập chỉ mục thông thường).

+0

Vì vậy, nếu tôi có 'Cột (a, b, c, d, e, f)' và hầu hết các truy vấn là '... WHERE A IN (...) AND B = 3' chỉ số của tôi 'Index (a, b, c, d)' là một tốt, nhưng nó không giúp đỡ nếu tôi có '... WHERE A IN (...) AND D = 5' là tại sao chỉ số mới của tôi tôi đã thực hiện, 'Chỉ số (a, d)' cải thiện hiệu suất rất nhiều, phải không? – Nate

+1

@Nate - chính xác. Hãy nghĩ về nó như một cuốn sách điện thoại. Nếu bạn chỉ biết tên của một người nào đó, nó không thể tìm thấy mà không nhìn qua toàn bộ cuốn sách kể từ khi nó được tổ chức vào LastName, Firstname – JNK

Các vấn đề liên quan