Oracle 10g を使用しています。これが私のクエリです
select * from Entries
where RefKey in (select RefKey
from Entries
where KeyStat = 1)
and RefKey = Key;
ここでは、RefKey、Key、KeyStat のすべてにインデックスが付けられています。テーブルは、ここでは使用されていない別の列で分割されています。このクエリでは、現在アクティブなマスター キー (RefKey = Key then master の場合) (KeyStat = 1) を選択しています。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」が気になります。このクエリで使用されているすべての列にインデックスが付けられている場合、オラクルがフルテーブルスキャンを実行する理由.
これをどのように最適化できますか? 内部クエリにいくつかの値を入れると、はるかに速く返されます。
サブクエリが必要な理由を説明するには、少なくとも 1 つのアクティブなキーを持つバッチ全体を選択しています。Refkey は一意ではありません。例えば:
Key=1, RefKey=1, Stat=1
Key=2, RefKey=1, Stat=0
Key=3, RefKey=2, Stat=1