Hôm nay tôi đang xem một bài đăng trên diễn đàn MOSC về Hệ số phân cụm (CF) cho một chỉ số. Một điều mà mọi người có xu hướng quên khi nói về CF là trong khi DBA có thể thực hiện một số hoạt động tổ chức lại để cải thiện CF cho một chỉ số, nó có khả năng phải trả một chỉ số khác cho cùng một bảng đó. Hãy xem xét ví dụ này mà tôi đã cung cấp trong chuỗi đó.
Ở đây tôi có một bảng với hai chỉ mục. Đây là bảng duy nhất trong lược đồ của tôi. Một chỉ mục (IDX2) có CF cao hơn nhiều so với chỉ mục kia (IDX1).
SQL> select index_name,clustering_factor from user_indexes;
INDEX_NAME CLUSTERING_FACTOR --------------- ----------------- MY_TAB_IDX2 135744 MY_TAB_IDX1 2257
DBA muốn "khắc phục" vấn đề này. DBA muốn giảm CF cho IDX2. Cách tốt nhất để làm điều đó là kéo dữ liệu ra khỏi bảng và sau đó chèn trở lại, được sắp xếp theo (các) cột mà IDX2 được xây dựng trên đó.
SQL> create table my_tab_temp as select * from my_tab;
Table created.
SQL> truncate table my_tab;
Table truncated.
SQL> insert into my_tab select * from my_tab_temp order by pk_id;
135795 rows created.
SQL> commit;
Commit complete.
SQL> exec dbms_stats.gather_table_stats(ownname=>USER,tabname=>'MY_TAB',cascade=>TRUE);
PL/SQL procedure successfully completed.
SQL> select index_name,clustering_factor from user_indexes;
INDEX_NAME CLUSTERING_FACTOR --------------- ----------------- MY_TAB_IDX2 2537 MY_TAB_IDX1 135747
Bây giờ CF cho IDX2 chắc chắn đã được cải thiện. Nhưng hãy nhìn vào CF trên IDX1. Nó trở nên tồi tệ hơn nhiều. Trên thực tế, hai chỉ số dường như đã thay đổi giá trị CF. Nếu tôi cố gắng reorg antoher, lần này sắp xếp theo (các) cột IDX1, thì các giá trị CF sẽ lật lại.
Đạo lý của câu chuyện này là người ta không thể đảm bảo rằng việc cải thiện CF cho một chỉ số sẽ không có ảnh hưởng tiêu cực đến một chỉ số khác của bảng đó.