Oracle 10gを使用しています。ここに私のクエリですIN句の最適化
select * from Entries
where RefKey in (select RefKey
from Entries
where KeyStat = 1)
and RefKey = Key;
ここでは、RefKey、KeyおよびKeyStatがすべて索引付けされています。テーブルはここでは使用されていない別のカラムに分割されています。 このクエリでは、現在アクティブな(KeyStat = 1)マスターキー(RefKey = Key、マスターの場合)を選択しています。 SQLTools 1.21 RC3を使用してこのクエリの実行計画を示します。
----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 270 | 218K (1)| 00:43:37 | | |
| 1 | NESTED LOOPS SEMI | | 1 | 270 | 218K (1)| 00:43:37 | | |
| 2 | PARTITION RANGE ALL | | 1 | 262 | 218K (1)| 00:43:37 | 1 | 12 |
|* 3 | TABLE ACCESS FULL | ENTRIES | 1 | 262 | 218K (1)| 00:43:37 | 1 | 12 |
|* 4 | TABLE ACCESS BY GLOBAL INDEX ROWID| ENTRIES | 10M| 77M| 3 (0)| 00:00:01 | ROWID | ROWID |
|* 5 | INDEX RANGE SCAN | IND_ENTR_REFKEY| 1 | | 2 (0)| 00:00:01 | | |
----------------------------------------------------------------------------------------------------------------------
私はID = 3 "TABLE ACCESS FULL"について懸念しています。この問合せで使用されているすべての列が索引付けされている場合、oracleが全表スキャンを実行する理由
これはどのように最適化できますか?内部クエリにいくつかの値を入れると、はるかに高速に戻ります。
サブクエリが必要な理由を説明する:少なくとも1つのアクティブなキーを持つバッチ全体を選択しています。 Refkeyは一意ではありません。例えば:
Key=1, RefKey=1, Stat=1
Key=2, RefKey=1, Stat=0
Key=3, RefKey=2, Stat=1
画像をアップロードすることができず、上記の実行計画が正しくフォーマットされていませんでした。申し訳ありません。 – bjan
テーブルに統計情報を収集しようとしましたか? –