Cần bao gồm các FK trong SQL Indexed View clustered index?


7

Tôi đang sử dụng chế độ xem được lập chỉ mục của SQL Server để cải thiện hiệu suất của phép nối lọc một bảng lớn (rất) theo một danh mục trên một bảng nhỏ. ví dụ:

CREATE VIEW BigTableSubset WITH SCHEMABINDING 
AS 
SELECT b.ID, b.SomeValue from BigTable b 
INNER JOIN SmallTable s on (b.CategoryFK = s.CategoryPK) 
where s.Type = 'Blah'

CREATE UNIQUE CLUSTERED INDEX PK_BigTableSubset ON BigTableSubset
(ID) 
INCLUDE (SomeValue)

(BigTable.ID là PK trên BigTable)

Hiệu năng truy vấn tăng đáng kể (vì tập hợp con yêu cầu bigtable đã được lưu trữ), nhưng tôi lo ngại để đảm bảo rằng SQL có thể tự cập nhật chỉ mục theo cách tối ưu nhất khi một trong hai bảng nguồn được cập nhật.

Vì vậy, câu hỏi là: tôi có cần đưa SmallTable.C CategoryPK vào chỉ mục được nhóm của chế độ xem để đảm bảo điều này hay SQL sẽ tự động làm điều này như một phần của cấu trúc chỉ mục? Hoặc nói cách khác, làm thế nào để SQL xác định những trang nào trong chỉ mục cần cập nhật mỗi khi cập nhật bảng 'bàn tay trái' (SmallTable) và tôi có cần phải làm gì để tạo điều kiện không?

Câu trả lời:


4

SQL Server sẽ luôn có thể tự động cập nhật (các) chỉ mục của khung nhìn khi (các) bảng nguồn thay đổi; bạn không cần phải làm gì thêm.

Bạn có thể kiểm tra gói truy vấn sửa đổi một trong các bảng nguồn, bạn sẽ thấy có các toán tử bổ sung để cập nhật (các) chỉ mục của chế độ xem, giống như cách nó phải cập nhật tất cả các chỉ mục không được áp dụng trên các bảng nguồn khi dữ liệu thay đổi .


0

Nếu bạn CẬP NHẬT SmallTable theo cách chạm vào bất kỳ cột nào trong chế độ xem, thì SQL sẽ thực hiện tra cứu bằng CategoryPK của SmallTable để tìm các hàng khớp trong BigTable mà bây giờ cần phải được hiển thị trong chế độ xem (hoặc bị xóa / thay đổi). Nếu bạn muốn tối ưu hóa việc tra cứu đó, bạn cần một chỉ mục trên BigTable (CategoryFK) INCLUDE (ID, someValue). Tổng quát hơn, bạn sẽ muốn đặt một chỉ mục trên BigTable như thể chế độ xem được lập chỉ mục không tồn tại và bạn đang thực hiện định nghĩa của Chế độ xem nhưng với WHERE SmallTable.CargetPK = 'foo'

Bạn không cần bất kỳ chỉ mục bổ sung nào trên SmallTable khi chế độ xem được lập chỉ mục được thêm vào; chỉ những cái đã có từ trước mà bạn đã sử dụng để tối ưu hóa CẬP NHẬT (nếu có) bởi vì trong quá trình đáp ứng CẬP NHẬT trên SmallTable, nó sẽ chọn bất kỳ giá trị nào cần thiết để sửa chữa Chế độ xem.


Bạn có thể đang nghĩ "nếu tôi phải đặt đúng chỉ mục trên BigTable để làm cho truy vấn nhanh ở vị trí đầu tiên, thì quan điểm của chế độ xem được lập chỉ mục là gì?" Chà, đó là một sự đánh đổi và có thể sẽ ổn khi các cập nhật trên SmallTable bị chậm nếu chúng hiếm và các chỉ mục trên BigTable không tốt vì lý do bên ngoài.

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.