Buộc SQL Server sử dụng các chỉ mục phân mảnh?


7

Tôi có một bảng khá lớn (> 10 triệu hàng) với các thao tác crud thường xuyên. Nó có các chỉ số thích hợp, nhưng chúng bị phân mảnh nhanh chóng. Nếu không có chỉ số định kỳ sắp xếp lại / xây dựng lại kế hoạch bảo trì, sự phân mảnh chỉ số có thể dễ dàng vượt quá 90%.

Ngay bây giờ tôi đã giải quyết vấn đề này bằng cách sắp xếp lại các chỉ mục hàng ngày và xây dựng lại hàng tuần. Tôi cũng đã chơi xung quanh với các yếu tố điền vv để giữ cho sự phân mảnh thấp hơn.

Vấn đề chính của tôi là khi các chỉ mục bị phân mảnh quá mức, SQL Server sẽ bỏ qua các chỉ mục và thay vào đó thực hiện quét toàn bộ bảng. Khi điều đó xảy ra, nó gần như giết chết ứng dụng vì việc quét liên tục bảng lớn như vậy thực sự rất nặng. Tôi khá chắc chắn rằng sử dụng một chỉ số phân mảnh sẽ nhanh hơn trong những trường hợp đó.

Có cách nào để cho SQL Server sử dụng chỉ mục bất kể sự phân mảnh của nó không?


5
Tôi tin rằng bạn có vấn đề đó do số liệu thống kê lỗi thời, không phải phân mảnh.
Denis Rubashkin

Câu trả lời:


14

Gợi ý chỉ số

Bạn có thể sử dụng một gợi ý chỉ mục để làm điều đó:

SELECT *
FROM dbo.Users AS u WITH (INDEX = ix_definitely_an_index)
WHERE u.Reputation = 2;

Nhược điểm là:

  • Có khả năng thay đổi rất nhiều mã
  • Nếu bạn đổi tên một chỉ mục, điều này sẽ phá vỡ
  • Nếu bạn thay đổi định nghĩa chỉ mục, nó có thể không còn là chỉ mục tốt nhất để sử dụng nữa

Hướng dẫn kế hoạch

Bạn cũng có thể sử dụng Hướng dẫn kế hoạch , đặt kế hoạch bạn muốn.

Nhược điểm là:

  • Nó hay thay đổi; nếu truy vấn của bạn không giống hệt nhau, kế hoạch của bạn có thể không được sử dụng
  • Thật khó để thiết lập; bạn phải có được mọi thứ chính xác
  • Ngoài ra các công cụ tương tự như một gợi ý chỉ mục, vì vậy uh ... Đó là thô.

Cửa hàng truy vấn?

Vì bạn đang ở trên SQL Server 2017, bạn có thể sử dụng Kho lưu trữ truy vấn để buộc các gói . Điều này dễ hơn nhiều so với sử dụng Hướng dẫn kế hoạch, nhưng bạn có thể kết thúc với một kế hoạch bất ngờ .

Nhược điểm:

  • Những thứ tương tự như trên
  • Phải kích hoạt Cửa hàng truy vấn, nếu bạn chưa sử dụng
  • Phải truy vấn Store Store để xem liệu các kế hoạch bắt buộc có bị lỗi không

Lựa chọn thay thế

Nếu không biết nhiều hơn, có lẽ tôi sẽ quan tâm hơn đến việc điều tra nếu chỉ số sử dụng thay đổi vì những lý do khác, như đánh hơi tham số .


1

Lần tới SQL Server bỏ qua chỉ mục, hãy cố gắng cập nhật số liệu thống kê với FULL SCAN trên chỉ mục đó hoặc trên toàn bộ bảng. Nếu điều đó hoạt động thì phân mảnh không phải là một vấn đề.

Ngoài ra, SQL Server không quan tâm đến việc phân mảnh khi chọn gói, nhưng nó có thể bỏ qua chỉ mục nếu nó trở nên quá lớn do "phân mảnh nội bộ". Vui lòng kiểm tra không gian trống bên trong các trang của chỉ mục của bạn.

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.