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

Được phân cụm và không được phân cụm

Sự khác biệt giữa chỉ mục được phân cụm và không được phân cụm là chỉ mục được phân cụm xác định thứ tự vật lý của các hàng trong cơ sở dữ liệu . Nói cách khác, áp dụng chỉ mục nhóm cho PersonId có nghĩa là các hàng sẽ được sắp xếp vật lý theo PersonId trong bảng, cho phép tìm kiếm chỉ mục trên này đi thẳng đến hàng (thay vì chỉ mục không theo nhóm, sẽ hướng bạn đến vị trí của hàng, thêm một bước).

Điều đó nói rằng, nó không bình thường để khóa chính không phải là chỉ mục nhóm, nhưng không phải là không có. Vấn đề với kịch bản của bạn thực sự ngược lại với những gì bạn đang giả định:bạn muốn duy nhất các giá trị trong một chỉ mục được nhóm lại, không phải các giá trị trùng lặp. Bởi vì chỉ mục được phân nhóm xác định thứ tự vật lý của hàng, nếu chỉ mục nằm trên cột không phải là duy nhất, thì máy chủ phải thêm giá trị nền cho các hàng có giá trị khóa trùng lặp (trong trường hợp của bạn là bất kỳ hàng nào có cùng PersonId ) để giá trị kết hợp (khóa + giá trị nền) là duy nhất.

Điều duy nhất tôi muốn đề xuất là không sử dụng khóa thay thế (CourtOrderId của bạn ) làm khóa chính, nhưng thay vào đó sử dụng khóa chính kết hợp của PersonId và một số cột hoặc tập hợp các cột nhận dạng duy nhất khác. Tuy nhiên, nếu điều đó là không thể (hoặc không thực tế), hãy đặt chỉ mục được phân cụm trên CourtOrderId .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Vấn đề về hiệu suất kỳ lạ:Biểu thức bảng phổ biến trong hàm nội tuyến do người dùng xác định

  2. Lỗi truy vấn với tên cột không rõ ràng trong SQL

  3. Làm cách nào để tôi có thể Chèn dữ liệu vào SQL Server bằng VBNet

  4. Có thể để mệnh đề Đầu ra SQL trả về một cột không được chèn vào không?

  5. Tác vụ tập lệnh SSIS C # 2012 tham chiếu WinSCPnet.dll không thành công khi chạy từ SQL Server Agent với ngoại lệ đã bị ném bởi mục tiêu của lời gọi