2012-05-11 29 views
9

Đối với các bảng 'lớn', có lý do gì để không đặt bộ lọc vào các chỉ mục cho các cột tùy chọn không?Chỉ mục được lọc của SQL: tôi có nên luôn đặt bộ lọc trên chỉ mục cho các cột tùy chọn không?

Vì vậy, đối với chỉ mục trên cột AAA (vì mọi người có thể tìm kiếm trên AAA),
Tôi có thể đặt bộ lọc thành ([AAA] IS NOT NULL).
Điều này tiết kiệm dung lượng lưu trữ, vì vậy tiết kiệm tiền.

Một số ưu điểm hơn từ technet:

  • Cải thiện truy vấn thực hiện và kế hoạch chất lượng
  • Giảm chi phí bảo trì chỉ số
  • Giảm chi phí lưu trữ chỉ số

Người ta nói rằng đó là tốt để đặt một lọc trên chỉ mục cho các cột hầu như trống. Nhưng tại sao tôi không đặt bộ lọc vào các chỉ mục cho các cột trống cho 1%? Có lý do gì để không làm điều đó nếu nó chỉ có lợi thế?

Trả lời

5

Đây thường là một ý tưởng tốt với hai gotchas:

  1. Các nhà thiết kế bảng có một lỗi (chỉ có sẵn Denali!). Khi nó xây dựng lại một bảng nó xóa tất cả các bộ lọc.
  2. Hãy chắc chắn rằng trình tối ưu hóa có thể cho biết tĩnh rằng vị từ của bạn sẽ không bao giờ cho phép trả về hàng rỗng. Thông thường, đây là trường hợp vì ngữ nghĩa SQL NULL (semmingly trường hợp duy nhất mà họ giúp thay vì cản trở). Ví dụ: select distinct col from T sẽ không sử dụng chỉ mục vì có thể tìm thấy giá trị null. Sử dụng điều này: select distinct col from T where col is not null.

Chỉ mục được lọc không được sử dụng rộng rãi. Họ thậm chí có thể được sử dụng để làm cho một cột nullable duy nhất.

Đề xuất thực tế của tôi: Chỉ cần thử trong một vài tháng và tìm hiểu chính mình nếu có thêm các vấn đề khác.

Nếu bạn sử dụng các kỹ thuật truy vấn SQL Server nâng cao, hãy xem các lần xem được lập chỉ mục quảng cáo. THey là một tập hợp siêu các chỉ mục được lọc (ít nhất là trên Enterprise).

+1

+1 cho câu trả lời thẳng, và gợi ý khác biệt và vô giá trị! –

0

Tất cả các chỉ số đều có những ưu và nhược điểm: Nhược điểm:

  1. chúng chiếm không gian đĩa
  2. họ cần phải được duy trì (sự cân bằng của cây index cần được reorgansised theo định kỳ để đảm bảo bất kỳ tối ưu hóa truy vấn không sử dụng phân phối dữ liệu bum) có thể là có nghĩa là chúng cần được đưa ra khỏi đường truyền - tin xấu nếu chúng bận
  3. chúng cần thời gian để cập nhật nếu có chèn thường xuyên

Ưu điểm:

  1. được thiết kế đúng cách, họ có thể loại bỏ bảng quét đắt
  2. thiết kế đúng, (một chỉ số bao phủ) họ có thể elimiate bất kỳ bảng đọc.

Vì vậy, như bình thường thì tùy thuộc.

  1. Quá nhiều chỉ số có thể đột ngột chậm ghi performanace
  2. Quá nhiều chỉ số có thể tăng đáng kể dispace sử dụng
  3. Không chỉ số phải đột ngột có thể làm giảm hiệu suất đọc

Một số người kiếm sống rất tốt ra khỏi thực sự biết công cụ của họ về các chỉ mục: Có những thứ tuyệt vời ở đây http://www.insidesqlserver.com/

Vì vậy, nó phụ thuộc vào tần suất người dùng trả về dữ liệu được tham chiếu bởi chỉ mục so với mức độ thường xuyên mà họ đang cập nhật dữ liệu chứa thông qua chỉ mục.

Chỉ mục cho các cột thưa thớt không khác nhau, tuy nhiên trong đó cột (phần lớn) trống thì các chỉ mục được lọc hiệu quả hơn. Khi giảm phụ tùng (ví dụ 50/50) thì việc phân phối dữ liệu có thể trở nên rất quan trọng khi người tối ưu hóa quyết định phương án tốt nhất để trả lại dữ liệu.Một chỉ số được lọc sẽ không biết phân phối dữ liệu bên ngoài bộ lọc - bit hiển nhiên nhưng cần được nói.

+2

Tôi nghĩ bạn đã bỏ lỡ điểm của câu hỏi. Nó không chỉ về các chỉ mục nói chung, về các bộ lọc của nó trên các chỉ mục. Nó lấy đi những bất lợi của bạn khi chiếm không gian đĩa vv .. –

+0

Xin lỗi, tôi đã cố gắng làm cho điểm mà khi xem xét chung để có một chỉ mục, những cân nhắc tổng thể bắt đầu ở cùng một vị trí. Mật độ dữ liệu, đọc vs viết vv Kết quả sẽ là chỉ mục/không có chỉ số và nếu chỉ số sau đó loại chỉ mục. Bạn cũng có thể sử dụng chỉ mục bị thiếu/không sử dụng được lưu trữ procs để điều chỉnh hiệu suất khi thời gian trôi qua và thay đổi phân phối dữ liệu. Chỉ mục được lọc chiếm nhiều không gian hơn không có chỉ mục, ít không gian hơn chỉ mục không được lọc. Không cố gắng để bắt đầu một cuộc chiến tranh! –

+0

Vì vậy, bây giờ cho câu hỏi của tôi: Bạn nói "nơi cột là phần lớn trống rỗng sau đó lọc chỉ số có hiệu quả hơn" -> Tại sao tôi không đặt một bộ lọc trên một chỉ số cho một cột mà chỉ có sản phẩm nào cho 5%, hoặc thậm chí như 1%? (nó vẫn có thể giống như 500000 hàng, vì vậy nó lưu trữ.) –

Các vấn đề liên quan