구체화 된보기를 통해 사전에 조인을 수행하여보다 신속하게 작성하려고하는이 정말 불쾌한보기가 있습니다. 내 문제는 가장 비싼 조인이며 따라서 사전 실행에 가장 가치가있는 조인이므로 구체화 된 뷰를 사용하면 좋지 않습니다. 응용 프로그램의집계 조인시 빠른 새로 고침으로 Oracle Materialized View 작성
목표는 가능한 살았다 데이터를 제공하는 것입니다, 그래서 매트 뷰를 만들 경우, 그들은 (내가 모르고 있어요 어쩌면 내가 고려하지 않은 다른 방법을) 커밋에 새로 고침을 빨리해야합니다. 빠른 새로 고침에는 제한이 있으며, 특히 rowid가 있어야합니다. 이 스레드보기 here; 하지만 내 문제는 약간 다르다. 왜냐하면 내 조인의 본질은 내가 합당한 기록을 얻기 위해 내 조인을 집계해야하기 때문이다. 여기
내가 (다른 천재 방법 또는 최적화) "사전 실행"할 내용은 다음과 같습니다0-*n*
수정이 기업에 만든 얻을 때문에 기본적으로
CREATE MATERIALIZED VIEW testing
NO LOGGING
CACHE
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT br.id, br.rowid, max(mr.id) as modifier_id --somehow fit mr.rowid in here
FROM tableA br --base record
LEFT OUTER JOIN tableA mr --modifier record
ON br.external_key = mr.external_key
AND mr.record_type_code in ('SOME','TYPE')
AND mr.status_code in ('SOME','STATUS');
를, 그것은 모두이다, 자체 조인입니다 동일한 테이블의 후속 행에서 수행됩니다. 주어진 유형 중 가장 최근의 것을 선택하겠습니다. (다른 유형의 경우 추가로이 작업을 수행합니다.) 위의 작업을하려면 br와 mr 모두의 rowid를 포함시켜야합니다.이 방법으로 내 머리를 감쌀 수 없습니다. 나는 MAX()
을 집계하는 대신에 rank()
과 ROWNUM
을 고려했으나, 논리를 올바르게 취할 수는 없다.
EDIT : 필요에 따라 새로 고침하고 전체적으로 애플릿을 제거하더라도 정확한 새로 고침 MV가 카드에 있는지 확실하지 않습니다 (정확하게 1 행이 있다고 가정). 오라클은 쿼리가 너무 복잡하다고 알려줍니다. 빠른 새로 고침. 그래서, 지금은 ... 다른 아이디어를 필요로
차이점이 있는지는 모르지만 수정 자 레코드에 MV를 시도한 적이 있습니까 (예 : 'SELECT external_key, id FROM tableA record_type_code IN ('SOME', 'TYPE') 및 status_code IN ('SOME', 'STATUS')'는 원래 쿼리에서 필요한 작업을 줄여줍니다. –
ANSI 구문을 원래 Oracle 조인 구문으로 바꾸어보십시오. 나는 (+) 문법을 싫어하지만 때로는 구체화 된 뷰가 필요하다. http://stackoverflow.com/a/1318667/409172 –
실제로 이전에 그렇게 했으므로 조금 더 나아졌다. 조인을 기반으로 빠른 NON-aggregated mv를 만들지 만, mv는 필자가 필요로하지 않는 많은 행을 캐싱 할 것이고, 여전히 mv 외부에서 MAX() 집계를 수행해야 할 것이다. 큰 불쾌한보기, 그래서 그것은 퍼포먼스 부스트의 적은. – GoldPaintedLemons