sql >> データベース >  >> RDS >> Oracle

2つのクラスタリング要因の物語

    今日、MOSCフォーラムで、インデックスのクラスタリング係数(CF)に関する投稿を見ていました。 CFについて話すときに人々が忘れがちなことの1つは、DBAがインデックスのCFを改善するために再編成アクティビティを実行できる一方で、同じテーブルの別のインデックスを犠牲にする可能性があることです。そのスレッドで提供したこの例を考えてみましょう。

    ここに、2つのインデックスを持つテーブルがあります。それは私のスキーマの唯一のテーブルです。一方のインデックス(IDX2)のCFは、もう一方のインデックス(IDX1)よりもはるかに高くなっています。

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

    DBAは、この問題を「修正」したいと考えています。 DBAは、IDX2のCFを削減したいと考えています。そのための最善の方法は、データをテーブルから引き出してから挿入し直し、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

    現在、IDX2のCFは確実に改善されています。しかし、IDX1のCFを見てください。それははるかに悪化しました。実際、2つのインデックスはCF値を反転させたようです。今度はIDX1列で並べ替えて再編成しようとすると、CF値が再び反転します。

    この話の教訓は、あるインデックスのCFを改善しても、そのテーブルの別のインデックスに悪影響が及ばないことを保証できないということです。


    1. TOP句を使用して、SQLServerクエリで返される行を制限する

    2. 初心者向けのSQLDROPCOLUMN

    3. MySQLのインデックスを理解する:パート2

    4. Oracleストアドプロシージャへのvarchar2入力のデフォルトサイズはいくつですか。変更できますか?