Cột bao gồm so với chỉ mục được lọc


11

Chúng tôi hiện đang làm việc với bảng có tên tb_tran like . Bảng này có 40 triệu hàng và có kích thước ~ 26 GB (dữ liệu 11 GB, chỉ mục 15 GB).

10 đến 15% các hàng là các hàng bị xóa mềm ( DeletingDate không phải là null). Applicaiton chỉ sử dụng các hàng trong đó DeletingDate là null. Tất cả các truy vấn vào bảng này sẽ bao gồm một mệnh đề cho hiệu ứng đó.

Có 15 chỉ số trên bảng này. Chỉ mục bị thiếu DMV chứa các đề xuất để tạo các chỉ mục với DeletingDate dưới dạng cột được bao gồm.

Sẽ hữu ích khi sử dụng một chỉ mục được lọc WHERE DeleteDdate IS NULLtrên tất cả 11 chỉ mục không bao gồm? Hoặc sẽ tốt hơn nếu có cột DeletingDate làm cột được bao gồm?

Câu trả lời:


12

Có, sửa đổi tất cả 11 chỉ mục NC thành các chỉ mục được lọc ( CREATE INDEX ... ON ... WHERE DeletedDate IS NULL) sẽ giúp ích. Bằng cách này bạn có được hai lợi thế:

  • Các Query Optimizer sẽ biết rằng bất kỳ hàng đến từ các chỉ số đã không đáp ứng bộ lọc truy vấn của bạn trên DeletedDate, vì vậy nó sẽ không phải tra cứu các nhóm chỉ số để kiểm tra gấp đôi so với DeletedDate
  • Tất cả các chỉ mục NC sẽ có kích thước nhỏ hơn 10-15%, cần ít bộ nhớ hơn và ít thao tác IO hơn để tra cứu.

Sự đánh đổi là bất kỳ truy vấn nào chăm sóc các hàng bị xóa mềm (và phải có một số truy vấn, nếu không thì tại sao các hàng tồn tại?) Sẽ không thể sử dụng các chỉ mục NC này.


7

Nếu bạn LUÔN sử dụng DeletedDate IS NULLbộ lọc trong các truy vấn của mình, thì có thể bạn sẽ thấy hiệu suất tăng đáng kể bằng cách thêm bộ lọc.

Đó là rất ít trang để công cụ kiểm tra để tìm các hàng có liên quan, có nghĩa là ít IO hơn (và tốc độ nhanh hơn).

Thêm nó như một INCLUDEDlĩnh vực sẽ là vô ích . Vì bạn luôn đưa nó vào bộ lọc, (nhưng có lẽ không bao giờ thêm nó vào danh sách CHỌN), trường đó sẽ không bao giờ được tham chiếu nếu bạn thêm nó dưới dạng INCLUDE.


2

Do 85-90% số hàng có DeletingDate là NULL, nên khả năng chọn lọc của một chỉ mục chỉ bao gồm DeletingDate là đủ để SQL sử dụng chỉ mục này. Tuy nhiên, được sử dụng cùng với các cột có tính chọn lọc khác, việc thêm DeletingDate vào các chỉ mục hiện có sẽ mang lại một số lợi ích nếu nó làm tăng tính chọn lọc chung của chỉ mục.

Như JNK nói, DeletingDate sẽ ít được sử dụng trong việc bao quát các chỉ mục trừ khi bạn sử dụng nó trong mệnh đề SELECT.

Vì đã có nhiều bộ lưu trữ cho các chỉ mục hơn là cho dữ liệu, bạn cũng có thể muốn xem liệu có bất kỳ sự dư thừa nào trong 15 chỉ mục NC hiện có hay không.

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.