1. Mở đầu
Một vụ án âm thầm phá hoại hiệu suất hệ thống: Cluster Factor cao bất thường. Truy vấn từng mượt mà nay trở nên ì ạch, chỉ mục tưởng chừng như anh hùng giờ thành kẻ tình nghi chính. Nguyên nhân là gì? Dữ liệu đã xáo trộn hay điều gì đang ẩn mình trong bóng tối? Hãy cùng bước vào cuộc điều tra đầy gay cấn để khám phá bí mật ẩn sau vụ án này.
2. Giải mã
Clustering factor là một thước đo đánh giá mức độ sắp xếp của một index so với bảng mà nó dựa trên. Nó được sử dụng để xác định chi phí của việc tra cứu bảng sau khi truy cập index. Clustering factor ghi lại số lượng blocks cần đọc khi quét qua index. Nếu một index có yếu tố clustering factor lớn, sẽ cần phải truy cập nhiều blocks dữ liệu của bảng để lấy các hàng (row) từ mỗi block của index (vì các hàng liền kề nằm rải rác ở các block khác nhau). Khi clustering factor gần với số block của bảng, điều đó chỉ ra rằng index được sắp xếp tốt; ngược lại, nếu clustering factor gần với số lượng hàng trong bảng, index không được sắp xếp hiệu quả. Clustering factor được tính theo công thức sau (giải thích ngắn gọn):
- Quét toàn bộ index theo thứ tự tăng dần của các giá trị trong index.
- Lấy ROWID của mỗi giá trị trong index, và so sánh block mà ROWID này trỏ đến với block của ROWID trước đó trong index.
- Mỗi khi ROWID trỏ đến một block khác với block của ROWID trước đó, clustering factor sẽ được tăng lên.
Cột CLUSTERING_FACTOR trong view USER_INDEXES cho biết mức độ tổ chức của dữ liệu so với các cột được index. Nếu giá trị của cột CLUSTERING_FACTOR gần bằng số lượng leaf block trong index, dữ liệu trong bảng được sắp xếp tốt. Ngược lại, nếu giá trị này không gần bằng số leaf block trong index, thì dữ liệu trong bảng không được sắp xếp tốt. Các leaf block của một index lưu trữ các giá trị được index cũng như các ROWID mà chúng trỏ đến.
Ví dụ, giả sử CUSTOMER_ID cho bảng CUSTOMERS được tạo ra từ một sequence generator, và CUSTOMER_ID là khóa chính của bảng. Index trên CUSTOMER_ID sẽ có clustering factor rất gần với số lượng leaf block (được sắp xếp tốt). Khi khách hàng được thêm vào cơ sở dữ liệu, họ sẽ được lưu trữ tuần tự trong bảng theo cách các số thứ tự được tạo ra từ sequence generator (được sắp xếp tốt). Tuy nhiên, một index trên cột CUSTOMER_NAME sẽ có clustering factor rất cao vì tên khách hàng được sắp xếp ngẫu nhiên trong bảng.
Clustering factor có thể ảnh hưởng đến các câu lệnh SQL thực hiện range scans. Với clustering factor thấp (so với số lượng leaf block), số lượng block cần để thực hiện truy vấn sẽ giảm. Điều này làm tăng khả năng các block dữ liệu đã được lưu sẵn trong bộ nhớ. Ngược lại, clustering factor cao so với số lượng leaf block có thể làm tăng số lượng block dữ liệu cần thiết để thực hiện range query dựa trên cột được lập chỉ mục.
TIP
Việc sắp xếp dữ liệu trong bảng có thể được tận dụng để cải thiện hiệu suất của các câu lệnh thực hiện các thao tác range scan. Bằng cách xác định cách cột được sử dụng trong các câu lệnh, việc lập index cho các cột này có thể mang lại lợi ích lớn.
3. Thông tin kết nối
Nếu anh em muốn trao đổi thêm về bài viết, hãy kết nối với mình qua LinkedIn và Facebook:
- LinkedIn: https://www.linkedin.com/in/nguyentrungnam/
- Facebook: https://www.facebook.com/trungnam.nguyen.395/
Rất mong được kết nối và cùng thảo luận!