Oracle
 sql >> Database >  >> RDS >> Oracle

Una storia di due fattori di raggruppamento

Stavo guardando un post sui forum MOSC oggi sul Clustering Factor (CF) per un indice. Una cosa che le persone tendono a dimenticare quando si parla di CF è che mentre il DBA può svolgere alcune attività di riorganizzazione per migliorare il CF per un indice, potrebbe potenzialmente venire a scapito di un altro indice per quella stessa tabella. Considera questo esempio che ho fornito in quel thread.

Qui ho una tabella con due indici. È l'unica tabella nel mio schema. Un indice (IDX2) ha un CF molto più alto dell'altro (IDX1).

SQL> select index_name,clustering_factor from user_indexes;
INDEX_NAME      CLUSTERING_FACTOR
--------------- -----------------
MY_TAB_IDX2                135744
MY_TAB_IDX1                  2257

Il DBA vuole "risolvere" questo problema. Il DBA vuole ridurre il CF per IDX2. Il modo migliore per farlo è estrarre i dati dalla tabella e quindi reinserirli, ordinati in base alle colonne su cui è basato IDX2.

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

Ora il CF per IDX2 è decisamente migliorato. Ma guarda il CF su IDX1. È andata molto peggio. In effetti, i due indici sembravano aver capovolto i valori CF. Se provo un'altra riorganizzazione, questa volta ordinando in base alle colonne IDX1, i valori CF si capovolgeranno di nuovo.

La morale di questa storia è che non si può garantire che il miglioramento del CF per un indice non avrà un effetto negativo su un altro indice di quella tabella.