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

Sự khác biệt giữa Quét bảng và Quét chỉ mục theo cụm là gì?

Trong bảng không có chỉ mục nhóm (bảng heap), các trang dữ liệu không được liên kết với nhau - vì vậy việc duyệt các trang yêu cầu xem vào Bản đồ Phân bổ Chỉ mục .

Tuy nhiên, một bảng được phân nhóm có các trang dữ liệu được liên kết trong một danh sách được liên kết kép - quét tuần tự nhanh hơn một chút. Tất nhiên, đổi lại, bạn có trách nhiệm giải quyết việc giữ các trang dữ liệu theo thứ tự trên INSERT , UPDATEDELETE . Tuy nhiên, một bảng heap yêu cầu một lần ghi thứ hai vào IAM.

Nếu truy vấn của bạn có RANGE toán tử (ví dụ:SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100 ), thì một bảng được phân nhóm (theo thứ tự được đảm bảo) sẽ hiệu quả hơn - vì nó có thể sử dụng các trang chỉ mục để tìm (các) trang dữ liệu có liên quan. Một đống sẽ phải quét tất cả các hàng, vì nó không thể dựa vào thứ tự.

Và, tất nhiên, một chỉ mục được phân nhóm cho phép bạn thực hiện XEM CHỈ SỐ ĐƯỢC ĐIỀU CHỈNH, điều này khá tối ưu cho hiệu suất ... một đống không có chỉ mục sẽ luôn dẫn đến việc quét bảng.

Vì vậy:

  • Đối với truy vấn ví dụ của bạn trong đó bạn chọn tất cả các hàng, sự khác biệt duy nhất là danh sách được liên kết kép mà một chỉ mục nhóm duy trì. Điều này sẽ làm cho bảng được nhóm của bạn nhanh hơn một chút so với một đống có nhiều hàng.

  • Đối với truy vấn có WHERE mệnh đề có thể được (ít nhất một phần) đáp ứng bởi chỉ mục nhóm, bạn sẽ đi ra phía trước do có thứ tự - vì vậy bạn sẽ không phải quét toàn bộ bảng.

  • Đối với một truy vấn không được đáp ứng bởi chỉ mục nhóm, bạn thậm chí còn khá nhiều ... một lần nữa, sự khác biệt duy nhất là danh sách được liên kết kép đó để quét tuần tự. Trong cả hai trường hợp, bạn là người chưa tối ưu.

  • Đối với INSERT , UPDATEDELETE một đống có thể thắng hoặc có thể không. Heap không phải duy trì trật tự, nhưng yêu cầu ghi lần thứ hai vào IAM. Tôi nghĩ rằng sự khác biệt về hiệu suất tương đối sẽ không đáng kể, nhưng cũng phụ thuộc khá nhiều vào dữ liệu.

Microsoft có báo cáo chính thức so sánh một chỉ mục được phân nhóm với một chỉ mục không được phân cụm tương đương trên một đống (không hoàn toàn giống như tôi đã thảo luận ở trên, nhưng gần giống). Kết luận của họ về cơ bản là đặt một chỉ mục theo cụm trên tất cả các bảng. Tôi sẽ cố gắng hết sức để tóm tắt kết quả của họ (một lần nữa, lưu ý rằng họ đang thực sự so sánh một chỉ mục không phân cụm với một chỉ mục được phân nhóm ở đây - nhưng tôi nghĩ nó tương đối so sánh được):

  • INSERT hiệu suất:chỉ mục theo cụm giành chiến thắng khoảng 3% do lần ghi thứ hai cần thiết cho một đống.
  • UPDATE hiệu suất:chỉ số theo nhóm thắng khoảng 8% do cần tra cứu thứ hai cho một đống.
  • DELETE hiệu suất:chỉ mục theo cụm giành chiến thắng khoảng 18% do cần tra cứu lần thứ hai và cần xóa lần thứ hai khỏi IAM cho một đống.
  • một SELECT hiệu suất:chỉ mục theo cụm giành chiến thắng khoảng 16% do cần tra cứu thứ hai cho một đống.
  • dải ô SELECT hiệu suất:chỉ số nhóm giành chiến thắng khoảng 29% do thứ tự ngẫu nhiên cho một đống.
  • đồng thời INSERT :bảng heap thắng 30% khi tải do sự phân chia trang cho chỉ mục nhóm.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm thứ tự nút trong tài liệu XML trong SQL Server

  2. “Truy vấn không được phép trong Waitfor” Lỗi 101 trong SQL Server

  3. Tại sao điều chỉnh hiệu suất SQL là kỹ năng quản lý cơ sở dữ liệu quan trọng nhất cần có

  4. Trả về tất cả các khóa ngoại tham chiếu đến một bảng đã cho trong SQL Server

  5. Giá trị cột danh tính đột nhiên nhảy đến 1001 trong máy chủ sql