Phân mảnh bảng là gì?
Phân mảnh bảng xảy ra khi dữ liệu bị xóa hoặc cập nhật khiến các khoảng trống (gaps) không liên tục trong các khối dữ liệu, làm cho dữ liệu lưu trữ không liền mạch trên ổ đĩa. Điều này ảnh hưởng đến hiệu suất truy xuất dữ liệu.
1. Phân mảnh bên trong (Internal Fragmentation)
• Xảy ra khi các khối dữ liệu có khoảng trống chưa sử dụng bên trong nhưng không được giải phóng hoàn toàn.
Ví dụ: Khi các dòng dữ liệu bị xóa bằng lệnh DELETE, khoảng trống đó sẽ không tự động được giải phóng.
2. Phân mảnh bên ngoài (External Fragmentation)
• Xảy ra khi các khối dữ liệu của bảng không nằm liền kề nhau trong không gian lưu trữ, làm tăng thời gian truy cập dữ liệu.
TRUNCATE vs DELETE và Phân mảnh
1.TRUNCATE
TRUNCATE là một lệnh DDL (Data Definition Language) chứ không phải DML (Data Manipulation Language).
• Khi bạn thực thi lệnh TRUNCATE TABLE, hệ thống sẽ xóa toàn bộ dữ liệu trong bảng một cách nhanh chóng bằng cách giải phóng các extents và đặt lại bảng về trạng thái trống, không giữ lại khoảng trống hay gây gaps.
• Các điểm quan trọng về TRUNCATE:
1. Giải phóng toàn bộ không gian lưu trữ
TRUNCATE xóa tất cả các extents mà bảng đang sử dụng, trả lại không gian lưu trữ cho hệ thống quản lý.
2. Đặt lại cấu trúc bảng
• Đặt lại con trỏ High Water Mark (HWM) về vị trí ban đầu.
(HWM là điểm đánh dấu dữ liệu lớn nhất được ghi trong bảng).
• Điều này có nghĩa là bảng sẽ trở lại trạng thái sạch sẽ, không có phân mảnh.
3.Không ghi log chi tiết từng dòng
TRUNCATE không ghi log cho từng dòng bị xóa (giống DELETE), chỉ ghi log việc giải phóng các exễtnt, dữ liệu sẽ bị xoá vĩnh viễn.
2.DELETE
Cơ chế hoạt động: DELETE xóa từng dòng một, các khối dữ liệu vẫn được giữ nguyên và các dòng trống sẽ tồn tại trong bảng.
• Có thể gây phân mảnh: Khi DELETE xóa một phần dữ liệu, các khoảng trống sẽ xuất hiện trong các khối dữ liệu, dẫn đến phân mảnh.
So sánh TRUNCATE, DELETE và DROP
Tiêu chí | TRUNCATE | DELETE | DROP |
Loại lệnh | DDL (Data Definition Language) | DML (Data Manipulation Language) | DDL |
Xóa dữ liệu | Xóa toàn bộ dữ liệu trong bảng | Xóa từng dòng dựa trên điều kiện | Xóa cả bảng và cấu trúc bảng |
Phân mảnh | Không gây phân mảnh, giải phóng extents | Có thể gây phân mảnh (khoảng trống giữa các dòng) | Không có dữ liệu hay cấu trúc bảng nào còn tồn tại |
Ghi log | Không ghi log chi tiết từng dòng | Ghi log từng dòng xóa | Ghi log việc xóa bảng |
Hiệu suất | Rất nhanh (do không ghi log nhiều) | Chậm hơn TRUNCATE | Nhanh nhưng xóa toàn bộ bảng |
Không gian lưu trữ | Giải phóng hoàn toàn không gian | Giữ lại cấu trúc và không gian khối | Trả lại toàn bộ không gian lưu trữ |
Khi nào nên dùng TRUNCATE?
1. Khi bạn cần xóa tất cả dữ liệu trong bảng
• TRUNCATE nhanh hơn DELETE do không ghi log chi tiết cho từng dòng.
2. Khi bạn không cần giữ lại không gian trống bên trong bảng
• Vì TRUNCATE sẽ giải phóng tất cả các extents.
3. Khi bạn muốn tránh phân mảnh
• TRUNCATE đặt lại HWM và giải phóng không gian lưu trữ, giúp bảng không bị phân mảnh.
TRUNCATE và High Water Mark (HWM)
• High Water Mark (HWM): Là điểm dữ liệu lớn nhất mà một bảng từng ghi.
• Khi bạn thêm dữ liệu vào bảng, HWM tăng dần.
• Khi xóa dữ liệu bằng DELETE, HWM không giảm, nên khoảng trống bên trong bảng vẫn còn.
• TRUNCATE đặt lại HWM về vị trí ban đầu vì nó xóa toàn bộ dữ liệu và các khối đã sử dụng.
Tác động của TRUNCATE trên chỉ mục và ràng buộc
1. Chỉ mục
• Khi TRUNCATE được thực thi, các chỉ mục trên bảng cũng sẽ được xóa và tạo lại.
2. Ràng buộc (Constraints)
• Nếu bảng có khóa ngoại (Foreign Key) tham chiếu từ bảng khác, bạn không thể thực thi TRUNCATE trực tiếp trừ khi loại bỏ các ràng buộc này.