Nhiều chỉ mục so với chỉ mục nhiều cột


646

Tôi vừa mới thêm một Chỉ mục vào một bảng trong SQL Server 2005 và nó khiến tôi suy nghĩ. Sự khác biệt giữa việc tạo 1 chỉ mục và xác định nhiều cột so với việc có 1 chỉ mục cho mỗi cột bạn muốn lập chỉ mục.

Có những lý do nhất định tại sao một cái nên được sử dụng hơn cái kia?

Ví dụ

Create NonClustered Index IX_IndexName On TableName
(Column1 Asc, Column2 Asc, Column3 Asc)

Đấu với

Create NonClustered Index IX_IndexName1 On TableName
(Column1 Asc)

Create NonClustered Index IX_IndexName2 On TableName
(Column2 Asc)

Create NonClustered Index IX_IndexName3 On TableName
(Column3 Asc)

Câu trả lời:


319

Tôi đồng ý với Cade Roux .

Bài viết này sẽ giúp bạn đi đúng hướng:

Một điều cần lưu ý, các chỉ mục được nhóm nên có một khóa duy nhất (một cột định danh tôi muốn giới thiệu) làm cột đầu tiên. Về cơ bản, nó giúp dữ liệu của bạn chèn vào cuối chỉ mục và không gây ra nhiều phân tách IO và Trang.

Thứ hai, nếu bạn đang tạo các chỉ mục khác trên dữ liệu của mình và chúng được xây dựng khéo léo, chúng sẽ được sử dụng lại.

ví dụ: hãy tưởng tượng bạn tìm kiếm một bảng trên ba cột

tiểu bang, quận, zip.

  • đôi khi bạn chỉ tìm kiếm theo tiểu bang.
  • đôi khi bạn tìm kiếm theo tiểu bang và quận.
  • bạn thường xuyên tìm kiếm theo tiểu bang, hạt, zip.

Sau đó, một chỉ mục với tiểu bang, quận, zip. sẽ được sử dụng trong cả ba tìm kiếm này.

Nếu bạn tìm kiếm bằng zip một mình khá nhiều thì chỉ mục trên sẽ không được sử dụng (bởi SQL Server) vì zip là phần thứ ba của chỉ mục đó và trình tối ưu hóa truy vấn sẽ không xem chỉ mục đó là hữu ích.

Sau đó, bạn có thể tạo một chỉ mục trên Zip sẽ được sử dụng trong trường hợp này.

Bằng cách này, chúng tôi có thể tận dụng thực tế là với lập chỉ mục Nhiều cột, cột chỉ mục đầu tiên luôn có thể sử dụng để tìm kiếm và khi bạn chỉ tìm kiếm theo 'trạng thái' thì nó hiệu quả nhưng không hiệu quả như chỉ mục Cột đơn ở trạng thái ' '

Tôi đoán câu trả lời bạn đang tìm kiếm là nó phụ thuộc vào mệnh đề của các truy vấn thường được sử dụng và cả nhóm của bạn.

Bài viết sẽ giúp rất nhiều. :-)


2
Vì vậy, điều tốt nhất để làm là xác định một chỉ mục cho tiểu bang, hạt và zip ngoài một chỉ mục riêng cho mỗi cột?
Maxim Zaslavsky

12
@jball Am tôi thiếu cái gì ở đây? Có vẻ như bài viết chủ yếu là về sự khác biệt giữa các giới hạn phiên bản SQL Server. Bài viết có thể đã được di chuyển?
Ian R. O'Brien

@Ian có vẻ như một cái gì đó đã bị mất trong vòng 3 năm kể từ khi tôi sắp xếp liên kết ban đầu từ bây giờ hơn 4 năm trước. Tôi có thể nói với bạn rằng bài đăng trên blog có tiêu đề chính xác như được liên kết bởi evilhomer, nhưng có vẻ như các blog tiếp theo trong loạt bài không còn dễ dàng tìm thấy từ bài đăng đầu tiên đó. Bạn sẽ phải loanh quanh trên kho lưu trữ blog của Kimberly để xem liệu bạn có thể bật lên những người khác trong loạt bài này không.
bóng

1
1) "Về cơ bản [Chỉ mục được nhóm với cột IDENTITY là đầu tiên] giúp chèn dữ liệu của bạn vào cuối chỉ mục" là chính xác. "Và không gây ra nhiều sự chia tách IO và Trang" là hoàn toàn sai trong hệ thống nhiều người dùng. Sự thật là, nó đảm bảo sự tranh chấp cao (đồng thời thấp) trong một hệ thống nhiều người dùng. 2) Chỉ mục được nhóm phải là Khóa quan hệ, nghĩa là. không một IDENTITY, GUID, etc. 3) "Sau đó, một chỉ mục với tiểu bang, hạt, zip. Sẽ được sử dụng trong cả ba tìm kiếm này." là sai và mâu thuẫn với "cột đầu tiên có thể sử dụng được". Các cols thứ 2 & subs trong chỉ mục không thể sử dụng để tìm kiếm.
PerformanceDBA

81

Đúng. Tôi khuyên bạn nên xem các bài viết của Kimberly Tripp về lập chỉ mục .

Nếu một chỉ mục là "bao phủ", thì không cần sử dụng bất cứ thứ gì ngoài chỉ mục. Trong SQL Server 2005, bạn cũng có thể thêm các cột bổ sung vào chỉ mục không phải là một phần của khóa có thể loại bỏ các chuyến đi đến phần còn lại của hàng.

Có nhiều chỉ mục, mỗi chỉ mục trên một cột có thể có nghĩa là chỉ có một chỉ mục được sử dụng - bạn sẽ phải tham khảo kế hoạch thực hiện để xem những gì ảnh hưởng đến các kế hoạch lập chỉ mục khác nhau.

Bạn cũng có thể sử dụng trình hướng dẫn điều chỉnh để giúp xác định chỉ mục nào sẽ làm cho một truy vấn hoặc khối lượng công việc nhất định thực hiện tốt nhất.


7
Kimberly Tripp biết những gì cô ấy đang nói về. Tôi đã nói chuyện với cô ấy và cô ấy biết những thứ này từ trong ra ngoài. Lời khuyên tuyệt vời.
evilhomer

@CadeRoux Nếu hầu hết các lần mệnh đề where của tôi có 2 cột trong mối quan hệ '&', sẽ tốt hơn nếu có một chỉ mục nhiều cột trên chúng hoặc chỉ mục cột đơn trên cả hai cột
Đó là một cái bẫy

2
@RachitGupta Một chỉ mục có cả hai cột
Cade Roux

40

Chỉ mục nhiều cột có thể được sử dụng cho các truy vấn tham chiếu tất cả các cột:

SELECT *
FROM TableName
WHERE Column1=1 AND Column2=2 AND Column3=3

Điều này có thể được tra cứu trực tiếp bằng cách sử dụng chỉ mục nhiều cột. Mặt khác, nhiều nhất có thể sử dụng một trong các chỉ mục một cột (nó sẽ phải tra cứu tất cả các bản ghi có Cột1 = 1, sau đó kiểm tra Cột 2 và Cột 3 trong mỗi chỉ số đó).


24
Chính xác. Tuy nhiên, việc có các cột này dưới dạng một chỉ mục, mỗi cột sẽ vẫn tăng tốc đáng kể. Thông thường, một trong các giá trị trong các cột sẽ làm giảm tập kết quả đến mức không cần tìm kiếm phần còn lại mà không có chỉ mục và trình tối ưu hóa rất tốt trong việc chọn giá trị này.
TToni

16

Một mục dường như đã bị bỏ lỡ là biến đổi sao. Các toán tử Giao lộ Chỉ mục giải quyết vị từ bằng cách tính toán tập hợp các hàng được đánh bởi mỗi vị từ trước khi bất kỳ I / O nào được thực hiện trên bảng thực tế. Trên lược đồ sao, bạn sẽ lập chỉ mục cho từng khóa thứ nguyên riêng lẻ và trình tối ưu hóa truy vấn có thể giải quyết các hàng sẽ chọn theo tính toán giao cắt chỉ mục. Các chỉ mục trên các cột riêng lẻ mang lại sự linh hoạt tốt nhất cho việc này.


+1 cho giải thích tốt được liên kết về cách sử dụng các chỉ mục (thông thường), có liên quan đến câu hỏi.
RobM

7

Nếu bạn có các truy vấn sẽ thường xuyên sử dụng một tập hợp các cột tương đối tĩnh, việc tạo một chỉ mục bao gồm tất cả chúng sẽ cải thiện hiệu suất đáng kể.

Bằng cách đặt nhiều cột trong chỉ mục của bạn, trình tối ưu hóa sẽ chỉ phải truy cập trực tiếp vào bảng nếu một cột không có trong chỉ mục. Tôi sử dụng rất nhiều trong kho dữ liệu. Nhược điểm là làm điều này có thể tốn rất nhiều chi phí, đặc biệt là nếu dữ liệu rất dễ bay hơi.

Tạo các chỉ mục trên các cột đơn rất hữu ích cho các hoạt động tra cứu thường thấy trong các hệ thống OLTP.

Bạn nên tự hỏi tại sao bạn lập chỉ mục các cột và cách chúng sẽ được sử dụng. Chạy một số kế hoạch truy vấn và xem khi chúng đang được truy cập. Điều chỉnh chỉ số là bản năng nhiều như khoa học.

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.