2013-06-05 3 views
2

구체화 된보기를 통해 사전에 조인을 수행하여보다 신속하게 작성하려고하는이 정말 불쾌한보기가 있습니다. 내 문제는 가장 비싼 조인이며 따라서 사전 실행에 가장 가치가있는 조인이므로 구체화 된 뷰를 사용하면 좋지 않습니다. 응용 프로그램의집계 조인시 빠른 새로 고침으로 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 행이 있다고 가정). 오라클은 쿼리가 너무 복잡하다고 알려줍니다. 빠른 새로 고침. 그래서, 지금은 ... 다른 아이디어를 필요로

+0

차이점이 있는지는 모르지만 수정 자 레코드에 MV를 시도한 적이 있습니까 (예 : 'SELECT external_key, id FROM tableA record_type_code IN ('SOME', 'TYPE') 및 status_code IN ('SOME', 'STATUS')'는 원래 쿼리에서 필요한 작업을 줄여줍니다. –

+0

ANSI 구문을 원래 Oracle 조인 구문으로 바꾸어보십시오. 나는 (+) 문법을 싫어하지만 때로는 구체화 된 뷰가 필요하다. http://stackoverflow.com/a/1318667/409172 –

+0

실제로 이전에 그렇게 했으므로 조금 더 나아졌다. 조인을 기반으로 빠른 NON-aggregated mv를 만들지 만, mv는 필자가 필요로하지 않는 많은 행을 캐싱 할 것이고, 여전히 mv 외부에서 MAX() 집계를 수행해야 할 것이다. 큰 불쾌한보기, 그래서 그것은 퍼포먼스 부스트의 적은. – GoldPaintedLemons

답변

1

그것은 당신의 상황에 적용되지 않을 수도 해요,하지만, 아마도 당신은 당신의 테이블을 비정규 수 있습니다. 여러 언어에 따라 이름이있는 경우

예를 들어, 당신은 각 언어에 대한 열을 명명 할 수 있었다.

예를 들어 액세스가 인덱스 기반 인 경우 varray 또는 nested tables을 고려하십시오./삽입/업데이트에서 삭제, 다른 테이블 (또는 테이블)을 업데이트하고 쿼리에 대해 해당 테이블을 사용

또 다른 아이디어는 트리거를 사용하는 것입니다. 아마도이 방법으로 집계를 사전 계산할 수도 있습니다.

+0

이 시점에서 내 마음이 확실히 트리거쪽으로 흔들리고 있습니다. – GoldPaintedLemons

+1

나는 방아쇠를 당겼다.IOT, 교차 결합에 집계 된 값을 유지합니다. 성능이 크게 향상되었습니다. 나는 바보 같다고 생각하지 않았다. 그래서 나는 내 마음에서 벗어나게 해줘서 고마워. – GoldPaintedLemons

+0

당신을 진심으로 환영합니다. 그리고 귀하의 진행 상황에 대한 귀하의 두 번째 의견에 감사드립니다. – Beryllium

0

난 단지 집계를 수행하는 구체화 된 뷰를 사용으로 보일 것이다, 그래서 당신은 단지 EXTERNAL_KEY 및 MAX (ID)를 저장하고 있습니다.

마스터 테이블에서 삭제가 발생하면 count (*)도 포함하십시오.

빠른 새로 고침 기능이 있어야합니다.

+0

그게 정확히 내가 필요로하는 것이지,하지만 내 쿼리를 단순화하려고 시도하고 단지 빠른 새로 고침의 요구 사항과 호환되지 않을 수 있습니다. 만약 당신이 나에게 구문 단서를 줄 수 있다면, 이것이 답이 될 것입니다. – GoldPaintedLemons

+0

DBMS_MView.Explain_MView 프로 시저를 살펴 보셨습니까? 그 결과를 게시 할 수 있다면 진단 적으로 도움이 될 것입니다. http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_mview.htm#CEGGEHHC –

+0

알았으므로이 내용을 닫고 베릴륨을 수여 할 것입니다. 궁극적으로 그의 제안에 따라 유용한 해결책이지만, 나는이 유틸리티로 나를 가리켜 주셔서 감사드립니다. 나는 그것을 실행했고 기본적으로 고속 리프레쉬 MV를 작동시키는 데 많은 문제를 보았다. 그 중 하나는'MAX()'를 사용하고 있다는 사실입니다. 결론을 내린 것은 가치가 없습니다. – GoldPaintedLemons

관련 문제