우리는 3 개의 컬럼으로 구성된 기본 키를 갖는 임시 데이터를 저장하는 몇 개의 테이블을 가지고 있습니다. 예 : 오늘의 최고 기온. 이 (이 순서대로) 복합 기본 키 인덱스 :옵티마이 저가 인덱스의 모든 컬럼을 사용하게합니다.
id number(10): the id of the timeserie.
day date: the day for which this data was reported
kill_at timestamp: the last timestamp before this data was deleted or updated.
단순화 된 논리 : 우리는 오전 10시 예측을 할 때,이 ID/일의 조합을 볼 수있는 마지막 항목은 자신의 create_at 9로 변경이 : 59am이고 새로 계산 된 값은 '31 .12.2999 '의 kill_at 타임 스탬프와 함께 저장됩니다. 이 테이블에
일반 질의는 다음과 같습니다
1) where id=? and day=? and kill_at=?
2) where id=? and day between (? and ?) and kill_at=?
3) where id=? and day between (? and ?)
4) where id=?
우리가 예상하지 시계열의 많음이있다. 즉, 우리는 그것이 측정되고 결코 변하지 않을 때 가치있는 것을 얻는다는 것을 의미합니다. 그러나 우리는 200-300 번 예측할 수있는 일부 timeseries가 있습니다. 따라서 하나의 id/day 조합에는 kill_at에 대해 다른 값을 가진 200 개 이상의 항목이 있습니다.
현재이 테이블의 유일한 (고유 한) 색인으로 기본 키 (id, day, kill_at) 만 있습니다. 그러나 쿼리 2 (정확한 ID 및 날짜 범위)로 쿼리하면 옵티마이 저는 인덱스의 첫 번째 열만 사용하기로 결정합니다.
ID OPERATION OPTIONS OBJECT_NAME OPTIMIZER SEARCH_COLUMNS
0 SELECT STATEMENT ALL_ROWS 0
1 FILTER 0
2 TABLE ACCESS BY INDEX ROWID DPD 0
3 INDEX RANGE SCAN DPD_PK 1
이것은 200 시간 이상 업데이트 된 시간대에 대해 큰 상처를줍니다. 이제 옵티마이 저가 인덱스의 3 열을 모두 사용하도록하는 방법을 찾고 있었지만 힌트를 찾을 수 없습니다. 하나 있습니까?
내 검색어의 속도를 높이는 방법에 대한 다른 제안 사항이 있습니까? 피크 기간을 줄이려고합니다. 평균 지속 시간은 덜 관심사입니다.
나를 혼란스럽게합니다 : 위의 실행 계획은 dba_hist_sql_plan에서 볼 수 있습니다. 이 명령문에 대한 유일한 실행 계획입니다. 그러나 고객에게 설명 계획을 보여줄 때 search_columns의 경우 1 또는 3 일 때가 있습니다. 그러나 우리의 응용 프로그램이이 Statement를 실행할 때가 3이 아닙니다.
'explain plan for select ...'를 사용하고 'select * from table (dbms_xplan.display (format =>'+ outline ')))'을 사용하여 실행 계획을 비교할 수 있습니까? '+ outline'은 오라클이 정확한 계획을 세우는 데 사용하는 옵티 마이저 힌트를 제공합니다. 출력물은 일반적으로 혼란스럽고 문서화되지 않은 힌트로 가득 차 있지만 차이점을 일으키는 원인에 대한 단서를 제공 할 수 있습니다. –