Vấn đề
Hãy làm rõ một số điều, bởi vì đây là một vấn đề phổ biến, một vấn đề nghiêm trọng đối với mọi công ty sử dụng SQL Server.
Sự cố này và nhu cầu TẠO CHỈ SỐ ĐƯỢC ĐIỀU CHỈNH bị hiểu nhầm.
Đồng ý rằng có một Chỉ mục Cụm vĩnh viễn sẽ tốt hơn là không có. Nhưng đó không phải là vấn đề quan trọng và dù sao thì nó cũng sẽ dẫn đến một cuộc thảo luận dài, vì vậy hãy gạt nó sang một bên và tập trung vào câu hỏi đã đăng.
Vấn đề là, bạn có sự phân mảnh đáng kể trên Heap . Bạn tiếp tục gọi nó là "bảng", nhưng không có thứ đó ở cấp độ lưu trữ dữ liệu vật lý hoặc DataStructure. Bảng là một khái niệm logic, không phải là một khái niệm vật lý. Nó là một tập hợp các DataStructures vật lý. Bộ sưu tập là một trong hai khả năng:
-
Heap
cộng với tất cả các Chỉ số không theo nhóm
cộng với chuỗi Văn bản / Hình ảnh -
hoặc Chỉ mục được nhóm
(loại bỏ Heap và một Chỉ mục không theo nhóm)
cộng với tất cả các Chỉ số không theo nhóm
cộng với chuỗi Văn bản / Hình ảnh.
Các đống bị phân mảnh nghiêm trọng; Càng có nhiều Chèn / Xóa / Cập nhật xen kẽ (ngẫu nhiên) thì càng có nhiều phân mảnh.
Không có cách nào để dọn dẹp Heap, như vậy. MS không cung cấp cơ sở vật chất (các nhà cung cấp khác thì có).
Giải pháp
Tuy nhiên, chúng ta biết rằng Create Clustered Index viết lại và sắp xếp lại toàn bộ Heap. Do đó, phương pháp (không phải là một thủ thuật) là Tạo chỉ mục được phân nhóm chỉ với mục đích khử phân mảnh Heap , và thả nó sau đó. Bạn cần không gian trống trong db của table_size x 1,25.
Trong khi bạn đang ở đó, bằng mọi cách, hãy sử dụng FILLFACTOR, để giảm tương lai sự phân mảnh. Sau đó, Heap sẽ chiếm nhiều không gian được phân bổ hơn, cho phép các Chèn, Xóa và mở rộng hàng trong tương lai do Cập nhật.
Lưu ý
-
Lưu ý rằng có ba Cấp độ của Phân mảnh; điều này chỉ đề cập đến Cấp III, sự phân mảnh trong Heap, nguyên nhân là do Thiếu chỉ mục được phân nhóm
-
Là một nhiệm vụ riêng biệt, vào một số thời điểm khác, bạn có thể muốn xem xét việc triển khai Chỉ mục được phân cụm vĩnh viễn, giúp loại bỏ hoàn toàn sự phân mảnh ... nhưng điều đó riêng biệt với vấn đề đã đăng.
Phản hồi nhận xét
Không hẳn. Tôi sẽ không gọi nó là một "giới hạn".
-
Phương pháp tôi đã đưa ra để loại bỏ Phân mảnh trong Heap là tạo Chỉ mục được phân cụm, và sau đó loại bỏ nó. I E. tạm thời, mục đích duy nhất của việc đó là khắc phục Sự phân mảnh.
-
Triển khai Chỉ mục được phân nhóm trên bảng (vĩnh viễn) là một giải pháp tốt hơn nhiều, vì nó làm giảm tổng thể Phân mảnh (DataStructure vẫn có thể bị Phân mảnh, hãy tham khảo thông tin chi tiết trong các liên kết bên dưới), ít hơn nhiều so với Phân mảnh xảy ra trong một Heap.
-
Mọi bảng trong cơ sở dữ liệu Quan hệ (ngoại trừ bảng "đường ống" hoặc "hàng đợi") phải có Chỉ mục được phân cụm, để tận dụng các lợi ích khác nhau của nó.
-
Chỉ mục theo cụm phải nằm trên các cột phân phối dữ liệu (tránh xung đột CHÈN), không bao giờ được lập chỉ mục trên cột tăng đơn điệu, chẳng hạn như ID bản ghi, đảm bảo CHÈN Điểm nóng trong Trang cuối cùng.
-
Trong MS SQL và Sybase ASE, có ba Cấp độ phân mảnh và trong mỗi Cấp độ, một số Loại khác nhau . Hãy nhớ rằng khi xử lý Phân mảnh, chúng ta phải tập trung vào DataStructures, không phải trên bảng (bảng là tập hợp các DataStructures, như đã giải thích ở trên). Các cấp độ là:
-
Cấp độ I • Cấu trúc dữ liệu bổ sung
Bên ngoài DataStructure có liên quan, trên hoặc trong cơ sở dữ liệu. -
Cấp độ II • Cấu trúc dữ liệu
Trong DataStructure có liên quan, ở trên các Trang (trên tất cả các Trang)
Đây là Cấp mà DBA thường xuyên giải quyết nhất. -
Cấp III • Trang
Trong Cấu trúc Dữ liệu có liên quan, trong các Trang
Các liên kết này cung cấp đầy đủ chi tiết lại Phân mảnh. Chúng dành riêng cho Sybase ASE, tuy nhiên, ở cấp độ cấu trúc, thông tin áp dụng cho MS SQL.
Lưu ý rằng phương pháp tôi đã đưa ra là Cấp độ II, nó sửa lại Phân mảnh cấp độ II và III.