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

Mọi Bảng Người dùng có nên có Chỉ mục được phân cụm không?

Thật khó để nói điều này ngắn gọn hơn SQL Server MVP Brad McGehee:

Theo quy tắc chung, mọi bảng phải có một chỉ mục theo nhóm. Nói chung, nhưng không phải lúc nào cũng vậy, chỉ mục nhóm phải nằm trên một cột tăng đơn điệu - chẳng hạn như cột nhận dạng hoặc một số cột khác mà giá trị đang tăng lên – và là duy nhất. Trong nhiều trường hợp, khóa chính là cột lý tưởng cho chỉ mục được phân nhóm.

BOL lặp lại tình cảm này:

Với một vài trường hợp ngoại lệ, mọi bảng phải có một chỉ mục được phân nhóm.

Lý do cho việc này là rất nhiều và chủ yếu dựa trên thực tế là một chỉ mục được phân cụm sắp xếp thứ tự vật lý dữ liệu của bạn trong bộ nhớ .

  • Nếu chỉ mục nhóm của bạn trên một cột đơn lẻ tăng lên, các lần chèn diễn ra theo thứ tự trên thiết bị lưu trữ của bạn và việc tách trang sẽ không xảy ra.

  • Các chỉ mục được phân cụm có hiệu quả để tìm một hàng cụ thể khi giá trị được lập chỉ mục là duy nhất, chẳng hạn như kiểu phổ biến của việc chọn một hàng dựa trên khóa chính.

  • Một chỉ mục được phân nhóm thường cho phép các truy vấn hiệu quả trên các cột thường được tìm kiếm các phạm vi giá trị (between , > , v.v.).

  • Tính năng phân cụm có thể tăng tốc các truy vấn trong đó dữ liệu thường được sắp xếp theo một hoặc các cột cụ thể.

  • Chỉ mục được phân nhóm có thể được xây dựng lại hoặc tổ chức lại theo yêu cầu để kiểm soát việc phân mảnh bảng.

  • Những lợi ích này thậm chí có thể được áp dụng cho các lượt xem.

Bạn có thể không muốn có một chỉ mục nhóm trên:

  • Các cột có dữ liệu thường xuyên thay đổi, vì SQL Server sau đó phải sắp xếp lại vật lý dữ liệu trong bộ nhớ.

  • Các cột đã được bao phủ bởi các chỉ mục khác.

  • Các khóa rộng, vì chỉ mục được phân nhóm cũng được sử dụng trong tra cứu chỉ mục không phân cụm.

  • Các cột GUID, lớn hơn danh tính và cũng có giá trị ngẫu nhiên hiệu quả (không có khả năng được sắp xếp theo), mặc dù newsequentialid() có thể được sử dụng để giúp giảm thiểu việc sắp xếp lại vật lý trong quá trình chèn.

  • Một lý do hiếm hoi để sử dụng heap (bảng không có chỉ mục nhóm) là nếu dữ liệu luôn được truy cập thông qua các chỉ mục không phân nhóm và RID (mã định danh hàng nội bộ của SQL Server) được biết là nhỏ hơn khóa chỉ mục được phân nhóm.

Do những điều này và những cân nhắc khác, chẳng hạn như khối lượng công việc ứng dụng cụ thể của bạn, bạn nên chọn cẩn thận các chỉ mục được nhóm của mình để có được lợi ích tối đa cho các truy vấn của mình.

Cũng xin lưu ý rằng khi bạn tạo khóa chính trên một bảng trong SQL Server, theo mặc định, nó sẽ tạo một chỉ mục nhóm duy nhất (nếu nó chưa có). Điều này có nghĩa là nếu bạn tìm thấy một bảng không có chỉ mục được phân cụm, nhưng có khóa chính (như tất cả các bảng đều nên làm), nhà phát triển trước đó đã quyết định tạo nó theo cách đó. Bạn có thể muốn có một lý do thuyết phục để thay đổi điều đó (trong số đó có rất nhiều lý do, như chúng ta đã thấy). Việc thêm, thay đổi hoặc loại bỏ chỉ mục được nhóm yêu cầu viết lại toàn bộ bảng và bất kỳ chỉ mục nào không được phân cụm, vì vậy việc này có thể mất một chút thời gian trên một bảng lớ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. XÓA hàng loạt trên SQL Server 2008 (Có bất kỳ điều gì giống như Sao chép hàng loạt (bcp) để xóa dữ liệu không?)

  2. Cách di chuyển cơ sở dữ liệu SQL Server sang cơ sở dữ liệu SQL Azure

  3. Cách tính tỷ lệ phần trăm bằng câu lệnh SQL

  4. Chuyển đổi hiệu quả các hàng thành cột trong máy chủ sql

  5. Sử dụng TYPE_NAME () để lấy tên của loại dữ liệu trong SQL Server