sql >> Databáze >  >> RDS >> Oracle

Příběh dvou shluků faktorů

Díval jsem se dnes na příspěvek na fóru MOSC o Clustering Factor (CF) pro index. Jedna věc, na kterou lidé mají tendenci zapomínat, když mluvíme o CF, je, že zatímco DBA může provést nějakou reorganizační aktivitu, aby zlepšil CF pro index, bude to potenciálně na úkor jiného indexu pro stejnou tabulku. Zvažte tento příklad, který jsem uvedl v tomto vláknu.

Zde mám tabulku se dvěma indexy. Je to jediná tabulka v mém schématu. Jeden index (IDX2) má CF mnohem vyšší než druhý (IDX1).

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

DBA chce tento problém „opravit“. DBA chce snížit CF pro IDX2. Nejlepší způsob, jak toho dosáhnout, je vytáhnout data z tabulky a poté je vložit zpět, seřazená podle sloupců, na kterých je IDX2 postaveno.

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

Nyní se CF pro IDX2 rozhodně zlepšil. Ale podívejte se na CF na IDX1. Bylo to mnohem horší. Ve skutečnosti se zdálo, že oba indexy převrátily hodnoty CF. Pokud se pokusím o antoher reorg, tentokrát seřazení podle sloupce (sloupců) IDX1, pak se hodnoty CF znovu obrátí.

Morálka tohoto příběhu je taková, že nelze zaručit, že zlepšení CF pro jeden index nebude mít negativní vliv na jiný index této tabulky.


  1. Převeďte datum na Juliánský den v PostgreSQL

  2. Pár rychlých věcí ke zpětné vazbě PASS

  3. Kdy je lepší ukládat příznaky jako bitovou masku, než používat asociativní tabulku?

  4. SQL dotaz pro rozdělení dat sloupců do řádků