2016-10-20 1 views
1

우리는 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이 아닙니다.

+0

'explain plan for select ...'를 사용하고 'select * from table (dbms_xplan.display (format =>'+ outline ')))'을 사용하여 실행 계획을 비교할 수 있습니까? '+ outline'은 오라클이 정확한 계획을 세우는 데 사용하는 옵티 마이저 힌트를 제공합니다. 출력물은 일반적으로 혼란스럽고 문서화되지 않은 힌트로 가득 차 있지만 차이점을 일으키는 원인에 대한 단서를 제공 할 수 있습니다. –

답변

1

실제로이 문제의 원인을 발견했습니다. 우리는 JPA/JDBC를 사용하고 있으며 JDBC 날짜 유형은 올바르게 모델링되지 않았습니다. 오라클 날짜 유형은 두 번째 정밀도이지만, 누군가 (나는 그를 싫어한다.) java.sql.Timestamp 유형의 엔티티에서 "day"속성을 만들었다. 효과는 Oracle이 Timestamp 쿼리 매개 변수와 비교하기 전에 Timestamp가되도록 테이블의 각 항목을 캐스팅 (기능 사용)해야합니다. 그렇게하면 색인을 제대로 사용할 수 없습니다.

+0

힌트 : 당신은 장소 전체에서 같은 대답을 사용하면 안됩니다. 오히려 답변을 한 번 작성하고 예를 들어 dups로 다른 질문을 닫을 수 있습니다. – GhostCat

+0

내가 대답 한 두 가지 질문은 매우 다릅니다. 그들은 근본 원인이 같습니다. 두 문제가 같은 솔루션으로 해결 될 수없는 이유를 이해할 수 없습니다. 왜 똑같은 대답으로 2 가지의 다른 질문에 대답 할 수는 없지만 전혀 다른 관계가없는 채로있을 수는없는 것일까 요? 이 질문 중 하나를 삭제하면 정보가 손실됩니다. (좋지 않음) – EasterBunnyBugSmasher

+0

정확하게 동일한 답변을 붙여 넣는 것은 단순히 우수 사례로 간주되는 것이 아닙니다. 일을 처리하는 일반적인 방법은 복제본으로 닫는 것입니다. 두 번 일어나는 일에 대해서는 별 문제가되지 않지만 확신을 가져야합니다. 누군가 같은 일을 여러 번 반복하면 누군가가 알아 차릴 것입니다. 모든 종류의 괴롭히기로 이어집니다. – GhostCat

관련 문제