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
, UPDATE
và DELETE
. 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
,UPDATE
vàDELETE
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.