Tôi đã thực hiện điều này trên các chỉ mục cụ thể trước đây, để hỗ trợ các truy vấn nặng. Thực tế, những gì họ đã làm là tạo ra nhiều chỉ mục được phân cụm: khi bất kỳ chỉ mục nào được sử dụng để tìm các hàng thì không cần làm thêm việc tìm kiếm phần còn lại của dữ liệu trong chỉ mục được phân cụm thực (hoặc heap nếu không có chỉ mục được phân cụm thực sự) .
Đây có phải là một chiến lược hợp lý?
Đối với một số chỉ mục cần hỗ trợ một số mẫu truy vấn nhất định, chắc chắn là có.
Nhưng để làm điều này với tất cả các chỉ số, tôi chắc chắn sẽ nói không.
Sẽ rất lãng phí không gian để làm ở những nơi không thực sự cần thiết và sẽ làm chậm đáng kể việc chèn / cập nhật. Nó có thể làm chậm nhiều truy vấn đọc vì nó cũng giúp, vì mỗi trang chỉ mục chứa ít bản ghi hơn nên mọi truy vấn cần tham chiếu một đoạn của chỉ mục để lọc nhưng không sử dụng tất cả các cột khác sẽ phải truy cập vào nhiều trang hơn. Điều này sẽ làm cho cơ sở dữ liệu của bạn ngốn nhiều bộ nhớ hơn: những trang đó sẽ cần được tải vào nhóm bộ đệm, có khả năng đẩy các trang hữu ích khác nếu bộ nhớ thấp. Nếu nén được sử dụng trên các chỉ mục đó để cố gắng giảm thiểu ảnh hưởng đến các yêu cầu lưu trữ và bộ nhớ, thì nó sẽ đẩy thêm tải cho CPU thay thế.
vì quyền truy cập thông qua ORM mà theo mặc định (nhưng không phải luôn luôn) truy xuất tất cả các cột
Đây là một mẫu phổ biến với việc sử dụng ORM (hoặc ORM ngây thơ) được tối ưu hóa kém và trong các trường hợp này, tôi đã thấy trình cố vấn chỉ mục của SQL Server (và các công cụ bên thứ 3 tương tự) đề xuất các chỉ mục có nhiều INCLUDE
cột d, vì vậy tôi sẽ đồng ý với đề nghị rằng đây là lý do tại sao các chỉ mục đã được tạo ra theo cách này.
Nhưng trong khi nó có thể làm cho tất cả các truy vấn như vậy nhanh hơn một chút và một số trong số chúng nhanh hơn đáng kể, tôi nghi ngờ rằng trong nhiều trường hợp, bất kỳ lợi ích nào cũng nhỏ đến mức không xứng đáng với dung lượng bộ nhớ bổ sung theo yêu cầu của bộ làm việc chung của bạn, không gian trên đĩa và IO giữa đĩa và bộ nhớ.
Ngoài ra, hãy nhớ rằng ORM có thể không chọn tất cả các cột của tất cả các bảng mà truy vấn chạm, do đó, lợi ích chỉ có thể giữ cho mục tiêu chính của yêu cầu hiện tại và các chỉ mục lớn hơn có thể xử phạt truy vấn khi các đối tượng khác được sử dụng để lọc nhưng không trả lại dữ liệu ( SELECT * FROM table1 WHERE id IN (SELECT someID FROM table2 WHERE someColumn='DesiredValue')
có lẽ).
Một xem xét khác cho không gian thừa được sử dụng, đặc biệt nếu dữ liệu lớn, là nó sẽ có tác động đến chiến lược sao lưu của bạn: chi phí lưu trữ và chuyển giao cho các bản sao lưu đó, thời gian khôi phục tiềm năng, v.v.
chúng ta nên chuẩn bị cho bất kỳ sự khác biệt nào giữa hai [tại chỗ & AzureQuery]
Nói chung, tôi nghĩ rằng các cân nhắc ở đây sẽ giống nhau trong từng trường hợp, mặc dù mọi chi phí bộ nhớ / IO vượt quá áp đặt bởi các chỉ mục lớn có thể hiển thị trực tiếp hơn trong Azure nơi bạn có thể điều chỉnh tầng dịch vụ và do đó chi phí cơ sở hạ tầng dễ dàng hơn thay vì có một bộ tài nguyên phần cứng tương đối cố định. Nếu sử dụng các mức tiêu chuẩn / cao cấp thay vì định giá dựa trên vcore thì bạn sẽ bị ảnh hưởng nhiều hơn bởi chi phí IO trong tiêu chuẩn vì phí bảo hiểm bao gồm nhiều IO hơn trên mỗi DTU. Nếu bạn đang sử dụng sao lưu đa vùng hoặc dự phòng hoặc các tính năng không cục bộ khác trong Azure thì có thể có chi phí băng thông liên quan đến không gian thêm được thực hiện bởi các chỉ mục rộng bất thường.
SELECT
không chỉ địnhORDER BY
bắt đầu trả về các hàng giống như trước nhưng với một thứ tự tùy ý khác.