Oracle インデックスの失敗の原因: 1. WHERE 句を使用していない; 2. "IS NULL" および "IS NOT NULL" を使用している; 3. WHERE 句で関数を使用している; 4. ファジー クエリに LIKE を使用している; 5. WHERE 句で不等号演算を使用する; 6. 一致しないデータ型を比較するなど。
このチュートリアルの動作環境: Windows 10 システム、Oracle 11g バージョン、Dell G3 コンピューター。
Oracle インデックスの目的は、テーブル全体のスキャンを回避し、クエリの効率を向上させることですが、場合によっては逆効果になることがあります。
たとえば、テーブル内に数百万のデータがあり、特定のフィールドにインデックスを追加してもクエリのパフォーマンスが向上しない場合、これは Oracle インデックスの障害が原因である可能性があります。 Oracle インデックスにはいくつかの制限があります。これらのインデックス制限に違反すると、インデックスを追加した場合でも、Oracle は依然としてテーブル全体のスキャンを実行します。インデックスを追加しない場合と比べてクエリのパフォーマンスは向上しません。代わりに、次のような理由が考えられます。インデックスを維持するシステムのオーバーヘッドにより、パフォーマンスが低下します。以下は、Oracle インデックスの失敗の原因となる 7 つの制約の概要です。
1. WHERE 句はありません
2. IS NULL および IS NOT NULL
SELECT ... FROM emp を使用しますWHERE comm IS NULL; comm 列のインデックスは無効になります
3. WHERE 句で関数を使用します
関数ベースのインデックスが使用されていない場合は、次に where 句 インデックス付きカラムで関数を使用する場合、オプティマイザはこれらのインデックスを無視します。例:
select * from staff where trunc(birthdate) = '01-MAY-82';
ただし、関数を条件に適用するとインデックスが有効になるので、上記の文を次の文に変更するとインデックスを使って検索できるようになります。
select * from staff where birthdate < (to_date('01-MAY-82') + 0.9999);
注: Oracle は引き続き MIN、MAX 関数のインデックスを使用します。
#4. ファジー クエリには LIKE '%T' を使用します。
5. WHERE 句で不等演算を使用します
等しくない操作には次のものが含まれます: a8093152e673feb7aba1828c43532094、!=、NOT colum >= ?、NOT colum <= ?この制限は、OR で置き換えることができます。たとえば、colum a8093152e673feb7aba1828c43532094 0 ===> 列>0 OR 列<06. 等しいインデックスと範囲インデックスは結合されません。
SELECT emp_id, emp_m, salary_q ... FROM emp WHERE job='manager' AND deptno>10job と deptno は両方とも非です。 Oracle はこの条件下ではインデックスをマージせず、最初のインデックスのみを使用します。
7. 比較はデータ型と一致しません
dept_id は varchar2 フィールドです。このフィールドにはインデックスがありますが、次のステートメントはテーブル全体を実行します。スキャン。select * from dept where dept_id = 900198;これは、Oracle が where 句を to_number(dept_id)=900198 に自動的に変換するためです。これは、インデックスの使用を制限する関数を使用するのと同じです。正しい書き方は次のとおりです。
select * from dept where dept_id = '900198';推奨チュートリアル: "
Oracle Video Tutorial"
以上がOracle はどのようにしてインデックスを無効にするのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。