Tại sao Chế độ xem được lập chỉ mục không cho phép các chỉ mục được nhóm không duy nhất?


12

Tôi đã xem xét việc sử dụng Chế độ xem được lập chỉ mục để tăng hiệu suất trên một số chế độ xem được sử dụng phổ biến nhất của chúng tôi.

Tuy nhiên, Chế độ xem được lập chỉ mục không hỗ trợ các chỉ mục được phân cụm không duy nhất đi đôi chút so với mức ưu tiên được thiết lập bởi phần còn lại của cấu trúc cơ sở dữ liệu.

Ví dụ, đây là một phiên bản đơn giản hóa của một vài bảng của chúng tôi.

-Groups-
Group ID    GroupName

-Users-
UserKey    UserName    FullName     GroupID

Các chỉ mục nằm trên Groups.groupID (Không phân cụm) và Users.groupID (Clustered). Khóa được nhóm trên GroupID trong bảng Người dùng vì thông thường nhất là một phạm vi người dùng từ một nhóm cụ thể sẽ được truy xuất. Rõ ràng bạn sẽ có nhiều người dùng mỗi nhóm, vì vậy chỉ mục cụm này là không duy nhất.

Điều này khiến tôi không chắc chắn về cách tuân theo quyền ưu tiên này khi lập chỉ mục các quan điểm của tôi như ví dụ này, vì tôi không thể có một chỉ mục cụm không duy nhất.

ConsumableID    ConsumableVariantID AllowThresholdOverwrite FullPath    GroupID ManufacturerID  Type    ModelID
101              29                 1                       0.1.2.4.    4       3               3       2

Trên thực tế, giá trị duy nhất trên Chế độ xem này sẽ luôn là duy nhất là cột ConsumableID, do đó tôi không có nhiều lựa chọn về vị trí đặt chỉ mục của mình.

Tại sao Chế độ xem không cho phép các chỉ mục cụm không duy nhất khi các bảng thông thường thực hiện?


3
Có một lời giải thích rất ngắn gọn ở gần cuối trang này có tên 'Tại sao chỉ mục đầu tiên trên một chế độ xem phải được CLUSTERED và ĐỘC ĐÁO?' nhưng nó không làm nhiều chi tiết. Tôi chắc chắn sẽ thích thú khi nghe một lời giải thích chi tiết hơn.
Steve Pettifer

5
Một vài ý kiến: 1 - Không có lý do gì bạn không thể nhóm lại (GroupID, UserID). Đừng giới hạn bản thân trong một cột duy nhất cho khóa. 2 - Tôi tưởng tượng giới hạn cho một khung nhìn là vì đây là một đối tượng dữ liệu bổ sung cần có các hàng dễ dàng gắn với các chỉ mục NC. Đối với một bảng, khóa CI không phải là duy nhất được gắn thêm vào nó, nhưng tôi nghĩ rằng điều đó sẽ khó khăn hơn với chế độ xem được lập chỉ mục vì nó không phải là một bảng thực tế mà cần phải LẬP LẠI một bảng thực tế.
JNK

Câu trả lời:


22

Giải thích sau đây được đưa ra trong Điều khoản kỹ thuật của Microsoft này :

Tại sao chỉ mục đầu tiên trên một chế độ xem phải được CLUSTERED và ĐỘC ĐÁO?

Nó phải là ĐỘC ĐÁO để cho phép dễ dàng tra cứu các bản ghi trong chế độ xem theo giá trị chính trong quá trình duy trì chế độ xem được lập chỉ mục và để ngăn việc tạo các chế độ xem với các bản sao, cần phải duy trì logic đặc biệt. Nó phải được phân cụm vì chỉ một chỉ mục được nhóm có thể thực thi tính duy nhất và lưu trữ các hàng cùng một lúc.

SQL Server sử dụng một hệ thống đại số delta để giữ các khung nhìn được lập chỉ mục theo từng bước với dữ liệu cơ sở. Nó cũng tự động kết hợp các toán tử kế hoạch truy vấn bảo trì chế độ xem cho mỗi truy vấn DML có ảnh hưởng đến một hoặc nhiều khung nhìn được lập chỉ mục. Có một chỉ mục cụm duy nhất trên khung nhìn đơn giản hóa rất nhiều chi tiết thực hiện.

Sự sắp xếp hiện tại cho phép các hình dạng cây toán tử bảo trì hình dạng cố định được kết hợp trong cây truy vấn DML cơ sở, cung cấp tính trực giao cũng giúp đơn giản hóa việc kiểm tra. Cuối cùng, các chế độ xem được lập chỉ mục có thể được tăng cường một ngày để hỗ trợ các chỉ mục được phân cụm không duy nhất, nhưng sau đó tất cả mọi thứ đều có thể được cung cấp không giới hạn thời gian và tài nguyên vô hạn (không áp dụng cho nhóm phát triển SQL Server tại thời điểm viết).

Để biết ví dụ cho thấy cách xây dựng kế hoạch truy vấn cập nhật phức tạp có thể nhận được và các lỗi tinh vi có thể dễ dàng xâm nhập như thế nào, hãy xem ví dụ này về lỗi xảy ra với MERGEvà các chỉ mục được lọc (một tính năng có kết nối chặt chẽ với các chế độ xem được lập chỉ mục).


2
Một lỗi tương tự có thể xảy ra nếu bạn cố cập nhật chế độ xem được lập chỉ mục có GROUP BYmệnh đề nhưng không phải tất cả các biểu thức nhóm là các khóa trong chỉ mục được nhóm. Nó hợp lệ kể từ SQL Server 2014.
Quassnoi

4

Trong SQL Server, tất cả các khóa chỉ mục phải là duy nhất. Điều này là cần thiết để có được các khóa khóa giải quyết chính xác một hàng. Nó cũng được yêu cầu để bảo trì chỉ số. Hãy tưởng tượng một NCI trên một cột chỉ có một giá trị trong đó (trùng lặp 100%). Nếu một hàng bị xóa khỏi bảng, công cụ lưu trữ phải tìm hàng NCI tương ứng và cũng xóa nó. Nếu tất cả các hàng NCI không thể phân biệt được thì điều này là không thể.

Vì vậy, bạn thấy rằng CI trên một khung nhìn phải là (bên trong) duy nhất để động cơ hoạt động.

Nếu bạn không tạo một chỉ mục duy nhất thì SQL Server vẫn làm cho nó trở nên duy nhất trong nội bộ. Trong trường hợp NCI trên bảng heap, nó sẽ gắn dấu trang hàng. Trong trường hợp CI không duy nhất, nó thêm một cột duy nhất. Trong trường hợp NCI trên bảng có CI, nó sẽ nối thêm bất kỳ cột khóa CI nào mà bản thân bạn chưa chỉ định (điều này có thể bao gồm cả trình duy nhất).

Không có cột rõ ràng nào có thể được thêm vào trong trường hợp chế độ xem được lập chỉ mục. Vì vậy, SQL Server không thể tự động làm điều này.

Thông thường, một điều khá rõ ràng đối với con người là những cột nào bạn có thể thêm vào để làm cho chế độ xem có một bộ cột duy nhất để sử dụng trong CI. Đây thường là các cột PK hoặc CI của một trong các bảng bên dưới. Nếu chế độ xem có một GROUP BYchỉ mục bình thường bạn trên các phím nhóm.


2
Tôi mạnh mẽ đề nghị sửa đổi cụm từ của câu trả lời này. Mặc dù nó chứa một điểm hợp lệ liên quan đến câu hỏi ban đầu, nhưng có vẻ như nó gợi ý rằng tất cả các chỉ mục không duy nhất đều chứa các duy nhất, không phải là trường hợp.
spaghettidba

@spaghettidba cảm ơn, tôi không nhận thấy điều đó. Hy vọng nó tốt hơn bây giờ.
usr

Xin lỗi nhưng chưa được đâu. Bạn đang trộn hai thứ lại với nhau. Các chỉ mục không bao gồm không phải là duy nhất và không được duy nhất trong nội bộ: bạn không làm cho điểm này đủ rõ ràng. Tất cả những gì bạn nói trong câu trả lời của bạn chỉ áp dụng cho các chỉ mục được nhóm.
spaghettidba

@spaghettidba NCIs luôn là duy nhất trong nội bộ. Họ luôn có thể xuất tất cả các khóa CI như một phần của kế hoạch truy vấn. Xem pastebin.com/vkGHpCsR Trang dữ liệu NCI chứa cả hai cột.
usr

Tôi thấy bạn đến từ đâu. Nhiều lá có thể chia sẻ cùng một khóa chỉ mục, nhưng khóa phân cụm luôn được bao gồm trong NCI. Có đủ để nói rằng họ luôn là duy nhất trong nội bộ? Tôi không nghĩ vậy.
spaghettidba
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.