Oracle 10g를 사용하고 있습니다. 여기 내 검색어입니다IN 절 최적화
select * from Entries
where RefKey in (select RefKey
from Entries
where KeyStat = 1)
and RefKey = Key;
여기에서 RefKey, Key 및 KeyStat 모두 색인이 생성됩니다. 테이블은 여기에서 사용되지 않는 다른 컬럼으로 분할됩니다. 이 쿼리에서 현재 마스터 키 (RefKey = 키, 마스터 인 경우)를 현재 선택합니다 (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 | | |
----------------------------------------------------------------------------------------------------------------------
나는 "TABLE ACCESS FULL"에 대해 우려하고 있습니다. 이 쿼리에서 사용되는 모든 열이 인덱싱되면 oracle이 전체 테이블 스캔을 수행하는 이유는 다음과 같습니다.
어떻게 최적화 할 수 있습니까? 내부 쿼리에 일부 값을 넣으면 훨씬 빠르게 반환됩니다.
하위 쿼리가 필요한 이유를 설명합니다. 하나 이상의 활성 키가있는 전체 일괄 처리를 선택합니다. Refkey는 고유하지 않습니다. 예를 들면 다음과 같습니다.
Key=1, RefKey=1, Stat=1
Key=2, RefKey=1, Stat=0
Key=3, RefKey=2, Stat=1
나는 이미지를 업로드 할 수 없습니다되었고, 위의 실행 계획 죄송합니다, 올바른 형식 점점되지 않았습니다. – bjan
테이블에서 통계를 수집 해 보셨습니까? –