Oracleのドキュメントには、インデックスの選択に関する一連の優れた考慮事項があります。http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004
19cの更新:https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/designing-and-developing-for-performance.html#GUID-99A7FD1B-CEFD-4E91-9486- 2CBBFC2B7A1D
引用:
-
WHERE句で頻繁に使用されるインデックスキーを検討してください。
-
SQLステートメントでテーブルを結合するために頻繁に使用されるインデックスキーを検討してください。結合の最適化の詳細については、「パフォーマンスのためのハッシュクラスターの使用」のセクションを参照してください。
-
選択性の高いインデックスキーを選択してください。インデックスの選択性は、インデックス付きキーに対して同じ値を持つテーブル内の行のパーセンテージです。同じ値を持つ行が少ない場合、インデックスの選択性が最適になります。注:Oracleは、整合性制約を使用して定義した一意の主キーのキーと式にインデックスを自動的に作成するか、既存のインデックスを使用します.1つまたは2つの値が多く発生するようにデータ分散が歪んでいる場合は、選択性の低い列にインデックスを付けると役立ちます他の値よりも少ない頻度です。
-
明確な値がほとんどないキーまたは式に標準のBツリーインデックスを使用しないでください。このようなキーまたは式は通常、選択性が低いため、頻繁に選択されるキー値が他のキー値よりも頻繁に表示されない限り、パフォーマンスは最適化されません。同時実行性の高いOLTPアプリケーションのようにインデックスが頻繁に変更されない限り、このような場合にビットマップインデックスを効果的に使用できます。
-
頻繁に変更される列にインデックスを付けないでください。インデックス付きの列を変更するUPDATEステートメントと、インデックス付きのテーブルを変更するINSERTおよびDELETEステートメントは、インデックスがない場合よりも時間がかかります。このようなSQLステートメントは、テーブルのデータだけでなく、インデックスのデータも変更する必要があります。また、追加の元に戻すとやり直しを生成します。
-
関数または演算子を使用してWHERE句にのみ表示されるキーにインデックスを付けないでください。 MINまたはMAX以外の関数を使用するWHERE句、またはインデックス付きキーを持つ演算子は、関数ベースのインデックスを除いて、インデックスを使用するアクセスパスを使用可能にしません。
-
多数の同時INSERT、UPDATE、およびDELETEステートメントが親テーブルと子テーブルにアクセスする場合は、参照整合性制約の外部キーにインデックスを付けることを検討してください。このようなインデックスを使用すると、子テーブルを共有ロックすることなく、親テーブルでUPDATEとDELETEを実行できます。
-
キーにインデックスを付けることを選択するときは、クエリのパフォーマンスの向上がINSERT、UPDATE、およびDELETEのパフォーマンスの低下と、インデックスの保存に必要なスペースの使用に見合うかどうかを検討してください。インデックスがある場合とない場合のSQLステートメントの処理時間を比較して実験することをお勧めします。 SQLトレース機能を使用して処理時間を測定できます。