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

En fortælling om to klyngefaktorer

Jeg kiggede på et indlæg på MOSCs fora i dag om Clustering Factor (CF) for et indeks. En ting, som folk har en tendens til at glemme, når de taler om CF, er, at selvom DBA kan lave nogle reorg-aktiviteter for at forbedre CF for et indeks, vil det potentielt komme på bekostning af et andet indeks for den samme tabel. Overvej dette eksempel, som jeg gav i den tråd.

Her har jeg en tabel med to indekser. Det er den eneste tabel i mit skema. Det ene indeks (IDX2) har en CF meget højere end det andet (IDX1).

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

DBA ønsker at "fikse" dette problem. DBA ønsker at reducere CF for IDX2. Den bedste måde at gøre det på er at trække dataene ud af tabellen og derefter indsætte dem, sorteret efter de(n) kolonne(r), IDX2 er bygget på.

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

Nu er CF til IDX2 absolut forbedret. Men se på CF på IDX1. Det blev meget værre. Faktisk så de to indekser ud til at have vendt CF-værdierne. Hvis jeg forsøger en anden omorganisering, denne gang sorteret efter IDX1-kolonnen(r), vil CF-værdierne vende igen.

Moralen i denne historie er, at man ikke kan garantere, at en forbedring af CF for et indeks ikke vil have en negativ indvirkning på et andet indeks i den tabel.


  1. Oracle Kombiner flere kolonner til én

  2. Sådan bruger du KNN Machine Learning Model med 2UDA – PostgreSQL og Orange (del 1)

  3. Nulstil AutoIncrement i SQL Server efter sletning

  4. Kopier nogle få af kolonnerne i en csv-fil til en tabel