結合インデックスのフィールド順序最適化の確立


結合インデックスのフィールド順序最適化の確立
概要
コンビネーションインデックスはよく使われていますが、コンビネーションインデックスを作成する順序をどう考えるかは推敲に値します.
本文
1.最も一般的なフィールドをできるだけ先頭に置く
作成する必要があるコンビネーションインデックスの場合、クエリー条件としてフィールドを単独で使用することが多い場合は、コンビネーションインデックスの前に置く必要があります.
このシーンでは、結合インデックスを直接使用して範囲スキャンを行うことができます.そうしないと、フィールドが後ろに置かれている場合は、インデックスジャンプスキャン、フルインデックススキャン、さらには全テーブルスキャンを実行することができます.
例:
  • まずテーブル
    create table t_userserviceinfo_test as select * from T_USERSERVICEINFO nologging;
    
  • を作成する.
  • インデックスを作成し、共通フィールドphonenumberを組み合わせインデックスのプリアンブル
    create index ix_userserviceinfo_test_1 on t_userserviceinfo_test(phonenumber,servstaus) tablespace ringidx; 
    
  • とする.
  • は番号で照会し、実行計画を表示し、インデックスの範囲をスキャンし、すぐに結果を調べた.

  • 反例:
  • 上記インデックス
    drop index ix_userserviceinfo_test_1;
    
  • を削除
  • 新しいインデックスを作成し、phonenumberをプリアンブル
    create index ix_userserviceinfo_test_1 on t_userserviceinfo_test(servstaus,phonenumber) tablespace ringidx; 
    
  • としない
  • も同様に番号で照会し、実行計画を表示し、インデックスのジャンプスキャンを行ったが、効果はよくなかった.

  • もちろん、OracleではCOSTの実行を検討しているので、このインデックスは実行されず、テーブル全体がスキャンされる可能性があります.
    2.できるだけ離散値の高いフィールドを前にする
       	1.             ,             
       	2.       ,             ,           ,   Oracle         ,         ,     。
    

    3.クエリの場合、列によっては非等値条件、点が等値条件の場合は、等値条件フィールドを前にします.
       	1.           ,      ,            。
       2.            ,            ,      ,             。
    

    例:
  • 現在、ステータスと時間に基づいてデータを検索する必要がある
     select * from t_userserviceinfo_test t where servstatus = 1 and t.upstatusstime > sysdate -100;
    
  • .
  • 履歴書の2つのインデックスは、それぞれステータスと時間フィールドの順序を逆転します:
    create index ix_userserv_test_1 on t_userserviceinfo_test(servstaus,upstatustime);
    
    create index ix_userserv_test_2 on t_userserviceinfo_test(upstatustime,servstaus);
    
  • 第1インデックス検索
    select /* +index(ix_userserv_test_1) */  *
    from t_userserviceinfo_test t where t.servstaus = 1 and t.upstatustime > sysdate -100;
    
    を用いて解析を行ったところ、一致した読み取り数334のデータの検索プロセスは、まずservstaus=1、upstatustime=sysdate-100から始まり、servstaus=1、upstatustime>sysdate-100を満たす最初のデータが見つかり、その後、インデックスツリーリーフノードで順番に検索され、最初の条件を満たさないデータ(servstaus=2)が見つかるまで、検索を終了します.このプロセスで検索されたインデックスは有効なインデックスです.
  • 2 2 2番目のインデックスを使用して検索:
  • select /* +index(ix_userserv_test_2) */  *
    from t_userserviceinfo_test t where t.servstaus = 1 and t.upstatustime > sysdate -100;
    
    一致読みは前の10倍で、効果はよくありません.データオーバープローブプロセスは、upstatustime>sysdate-100の範囲インデックススキャンに基づいて、servstaus=1でデータをフィルタリングし、不要な検索が大量に存在する.
    まとめ:
    コンポジットインデックスを作成するには、自分や他のシーンの使用状況を考慮し、順序を勝手に指定しないでください.