1

次のようなクエリがあります。

select *
from table1
where status = 'ACTV'
and child_id <> parent_id

問題は、このテーブルが非常に大きく、Oracle が完全なテーブル スキャンを実行していることです。このクエリを高速化するインデックス (status、child_id、parent_id 列を含む) を作成しようとしましたが、Oracle はヒントがあってもこのインデックスを使用していません。

このクエリを高速化する方法はありますか?

4

2 に答える 2

1

関数でインデックスを使用できます:

CREATE INDEX child_parent ON table1(DECODE(child_id,parent_id,1, 0))

そして、あなたの選択でそれを使用してください:

select *
from table1
where status = 'ACTV'
  and DECODE(child_id,parent_id,1, 0) = 0

このソリューションの唯一の短所 - 通常のインデックスよりも挿入操作と更新操作が少し遅くなります。また、返される可能性のあるレコード数が多い場合、Oracleはテーブルのフルスキャンを実行できます

于 2015-04-24T11:59:35.300 に答える