結合インデックスのフィールド順序最適化の確立
結合インデックスのフィールド順序最適化の確立
概要
コンビネーションインデックスはよく使われていますが、コンビネーションインデックスを作成する順序をどう考えるかは推敲に値します.
本文
1.最も一般的なフィールドをできるだけ先頭に置く
作成する必要があるコンビネーションインデックスの場合、クエリー条件としてフィールドを単独で使用することが多い場合は、コンビネーションインデックスの前に置く必要があります.
このシーンでは、結合インデックスを直接使用して範囲スキャンを行うことができます.そうしないと、フィールドが後ろに置かれている場合は、インデックスジャンプスキャン、フルインデックススキャン、さらには全テーブルスキャンを実行することができます.
例:まずテーブル を作成する.インデックスを作成し、共通フィールドphonenumberを組み合わせインデックスのプリアンブル とする.は番号で照会し、実行計画を表示し、インデックスの範囲をスキャンし、すぐに結果を調べた.
反例:上記インデックス を削除新しいインデックスを作成し、phonenumberをプリアンブル としないも同様に番号で照会し、実行計画を表示し、インデックスのジャンプスキャンを行ったが、効果はよくなかった.
もちろん、OracleではCOSTの実行を検討しているので、このインデックスは実行されず、テーブル全体がスキャンされる可能性があります.
2.できるだけ離散値の高いフィールドを前にする
3.クエリの場合、列によっては非等値条件、点が等値条件の場合は、等値条件フィールドを前にします.
例:現在、ステータスと時間に基づいてデータを検索する必要がある .履歴書の2つのインデックスは、それぞれステータスと時間フィールドの順序を逆転します: 第1インデックス検索 2 2 2番目のインデックスを使用して検索:
まとめ:
コンポジットインデックスを作成するには、自分や他のシーンの使用状況を考慮し、順序を勝手に指定しないでください.
概要
コンビネーションインデックスはよく使われていますが、コンビネーションインデックスを作成する順序をどう考えるかは推敲に値します.
本文
1.最も一般的なフィールドをできるだけ先頭に置く
作成する必要があるコンビネーションインデックスの場合、クエリー条件としてフィールドを単独で使用することが多い場合は、コンビネーションインデックスの前に置く必要があります.
このシーンでは、結合インデックスを直接使用して範囲スキャンを行うことができます.そうしないと、フィールドが後ろに置かれている場合は、インデックスジャンプスキャン、フルインデックススキャン、さらには全テーブルスキャンを実行することができます.
例:
create table t_userserviceinfo_test as select * from T_USERSERVICEINFO nologging;
create index ix_userserviceinfo_test_1 on t_userserviceinfo_test(phonenumber,servstaus) tablespace ringidx;
反例:
drop index ix_userserviceinfo_test_1;
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;
create index ix_userserv_test_1 on t_userserviceinfo_test(servstaus,upstatustime);
create index ix_userserv_test_2 on t_userserviceinfo_test(upstatustime,servstaus);
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)が見つかるまで、検索を終了します.このプロセスで検索されたインデックスは有効なインデックスです.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でデータをフィルタリングし、不要な検索が大量に存在する. まとめ:
コンポジットインデックスを作成するには、自分や他のシーンの使用状況を考慮し、順序を勝手に指定しないでください.