Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Chỉ mục nhóm nên được đặt trên cột nào?

Trình tối ưu hóa truy vấn có thể sử dụng chỉ mục, theo nhóm hoặc không theo nhóm, nếu và chỉ khi khóa ngoài cùng bên trái trong chỉ mục được lọc trên. Vì vậy, nếu bạn xác định chỉ mục trên các cột (A, B, C), điều kiện WHERE trên [email protected] , trên [email protected] hoặc trên [email protected] AND [email protected] sẽ không tận dụng hoàn toàn chỉ số (xem lưu ý). Điều này cũng áp dụng cho các điều kiện tham gia. Bất kỳ bộ lọc WHERE nào bao gồm A sẽ xem xét chỉ mục:[email protected] hoặc [email protected] AND [email protected] hoặc [email protected] AND [email protected] hoặc [email protected] AND [email protected] AND [email protected] .

Vì vậy, trong ví dụ của bạn nếu bạn tạo chỉ mục clustred trên part_no là phím ngoài cùng bên trái, sau đó là truy vấn tìm kiếm một part_id cụ thể sẽ không sử dụng chỉ mục và chỉ mục không phân cụm riêng biệt phải tồn tại trên part-id .

Bây giờ về câu hỏi cái nào trong số nhiều chỉ mục nên được nhóm một. Nếu bạn có một số mẫu truy vấn có cùng tầm quan trọng và tần suất và mâu thuẫn với nhau về các khóa cần thiết (ví dụ:truy vấn thường xuyên bằng một trong hai part_no hoặc part_id ) thì bạn xem xét các yếu tố khác:

  • chiều rộng :khóa chỉ mục được phân nhóm được sử dụng làm khóa tra cứu bởi tất cả các chỉ mục không phân cụm khác. Vì vậy, nếu bạn chọn một khóa rộng (giả sử là hai cột định danh) thì bạn đang làm cho tất cả các chỉ mục khác rộng hơn, do đó tiêu tốn nhiều dung lượng hơn, tạo ra nhiều IO hơn và làm chậm mọi thứ. Vì vậy, giữa các khóa tốt bằng nhau theo quan điểm đã đọc, hãy chọn khóa hẹp nhất theo nhóm và làm cho các khóa rộng hơn không được phân cụm.
  • tranh chấp :nếu bạn có các mẫu chèn và xóa cụ thể, hãy cố gắng tách chúng về mặt vật lý để chúng xuất hiện trên các phần khác nhau của chỉ mục được nhóm. Ví dụ. nếu bảng hoạt động như một hàng đợi với tất cả các lần chèn ở một đầu lôgic và tất cả sẽ xóa ở đầu lôgic khác, hãy cố gắng bố trí chỉ mục được phân nhóm sao cho thứ tự vật lý khớp với thứ tự lôgic này (ví dụ:thứ tự xếp hàng).
  • phân vùng :nếu bảng rất lớn và bạn định triển khai phân vùng thì khóa phân vùng phải là chỉ mục được phân cụm. Ví dụ điển hình là dữ liệu lịch sử được lưu trữ bằng cách sử dụng sơ đồ phân vùng cửa sổ trượt. Ngay cả khi các thực thể có khóa chính logic như 'entity_id', chỉ mục clustred được thực hiện bởi một cột datetime cũng được sử dụng cho chức năng phân vùng.
  • ổn định :khóa thường xuyên thay đổi là một ứng cử viên kém cho khóa được phân cụm vì mỗi lần cập nhật giá trị khóa được nhóm lại và buộc tất cả các chỉ mục không phân cụm để cập nhật khóa tra cứu mà chúng lưu trữ. Vì bản cập nhật của một khóa được phân nhóm cũng sẽ có khả năng di chuyển bản ghi sang một trang khác, điều này có thể gây ra sự phân mảnh trên chỉ mục được phân nhóm.

Lưu ý:không đầy đủ đòn bẩy vì đôi khi công cụ sẽ chọn một chỉ mục không phân cụm để quét thay vì chỉ mục được phân cụm đơn giản vì nó hẹp hơn và do đó có ít trang hơn để quét. Trong ví dụ của tôi, nếu bạn có chỉ mục trên (A, B, C) và bộ lọc WHERE trên [email protected] và các dự án truy vấn C , chỉ mục có thể sẽ được sử dụng nhưng không phải là tìm kiếm, quét, vì vẫn nhanh hơn so với quét toàn bộ theo cụm (ít trang hơn).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách trích xuất hoặc chuyển đổi dữ liệu thời gian từ một chuỗi trong SQL Server

  2. Cách Chèn kết quả của một thủ tục đã lưu trữ vào một bảng tạm thời trong SQL Server

  3. Tham gia một bảng dựa trên các giá trị được phân tách bằng dấu phẩy

  4. SQL Server v.Next:Hiệu suất STRING_AGG, Phần 2

  5. Sự khác biệt giữa datetime và timestamp trong sqlserver?