2012-11-21 4 views
0

오라클 11g 데이터베이스에 몇 개의 MV가 있습니다. 새로운 요구 사항은 반드시 있어야한다는 것을 의미합니다.쿼리에 영향을주지 않고 oracle mview를 자르십시오.

아톰이 아닌 경우 DBMS_MVIEW.REFRESH는 일련의 삽입 전에 자르기를 수행하지만 atomic => true 일 때 모든 레코드가 먼저 하나씩 삭제된다는 것을 알고 있습니다. 비 원자 버전이 단 몇 분 동안 레코드를 삭제하는 데 한 시간이 걸립니다.

내가 새로 고치는 동안 계속이 MV에 대한 쿼리를 허용하는 방법이 필요합니다. MV 쿼리가 카운트를 사용하고 mosts 레코드가 어쨌든 변경 될 것이기 때문에 FAST 리프레시 방법은 의문의 여지가 있습니다.

LOCK TABLE FOOBAR_MVIEW_LOCK IN EXCLUSIVE MODE; 
SELECT * FROM FOOBAR_MVIEW_DATA1,FOOBAR_MVIEW_DATA2; 
COMMIT; 

LOCK TABLE FOOBAR_MVIEW_LOCK IN EXCLUSIVE MODE; 
EXECUTE DBMS_MVIEW.REFRESH('FOOBAR_MVIEW_DATA1,FOOBAR_MVIEW_DATA2','cc'); 
COMMIT; 

더 나은 방법이 있나요을 :

그래서, 함께 왔어요 구조물이있다? NB. 파티션 교체에 대해 이야기하기 시작하면 팀 리더가 긴장을 느낍니다. :-)

+0

나는 당신이 생각해 낸 구조, 문제를 해결하는 방법, 명시 적 잠금이 제공하는 이점, 또는 둘 사이의 데카르트 결합을 수행하는 쿼리의 역할에 대해 잘 모르겠다. 테이블이 있습니다. 제안 된 솔루션에 대해 좀 더 자세히 설명해 주시겠습니까? –

+0

쿼리는 실제 쿼리가 아니며 구문을 보여줍니다. 아이디어는 쿼리를 수행하는 프로세스가 있고 또 다른 수행하는 새로 고침이 있다는 것입니다. 각 세션이 다른 쪽에서 잠금을 해제 할 때까지 기다려야하므로 한 번에 하나만 제어 할 수 있습니다. –

+0

쿼리를 실행하는 세션이 하나 뿐이니까? –

답변

0

파티셔닝에 대해 이야기하기 시작했을 때 팀 리더는 긴장했습니다. 이는 팀 단장의 우려 사항을 해결할 수 있다면 파티셔닝 옵션에 대한 라이센스를 취득했음을 의미합니까? 아니면 그 옵션을 버려야한다는 뜻입니까?

파티션 전환이 옵션이 아닌 경우, 하나의 테이블 (또는 구체화 된 뷰)을 가리키는 동의어를 다른 테이블 (또는 구체화 된 뷰)로 넘기는 접근법이 있습니다. 따라서, 예를

  • 에 대한 FOOBAR_MVIEW_DATA1
  • FOOBAR_MVIEW_DATA1_BASE1에 구조적으로 FOOBAR_MVIEW_DATA1_BASE1
  • 당신이 구체화 된 뷰를 새로 고칠과 동일 빈 테이블 FOOBAR_MVIEW_DATA1_BASE2 만들기 FOOBAR_MVIEW_DATA1_BASE1
  • 에 대한 동의어 FOOBAR_MVIEW_DATA1 만들기 이름 바꾸기, 데이터를 FOOBAR_MVIEW_DATA1_BASE2에 삽입하고 사전 빌드 된 테이블에 구체화 된 뷰를 작성하십시오.
  • 데이터가 갱신되면
  • , 기존 쿼리가 모두 완료 미래의 어느 시점에서 FOOBAR_MVIEW_DATA1_BASE2
  • 에서 동의어 FOOBAR_MVIEW_DATA1 포인트, 당신은 FOOBAR_MVIEW_DATA1_BASE1을자를 수 있습니다. FOOBAR_MVIEW_DATA1_BASE1FOOBAR_MVIEW_DATA1_BASE2의 이름을 바꾸어 구체화 된보기 새로 고침 (항상 _BASE1의 데이터가 있고 _BASE2이 비어 있음)과 동일한 시작점을 갖도록 선택하거나 새로 고침 코드를 작성하여 동의어가 가리키는 위치를 확인하고 무엇이든지로드 할 수 있습니다 테이블은 동의어에 의해 참조되지 않습니다.
+0

그 이유는 프로덕션 데이터베이스에서 파티션을 전환하기 때문에 dev 및 테스트에 문제가 있다는 것입니다. 동의어 아이디어는 이미 고려되었지만 2 개의 MV가 있으며 둘 사이의 불일치가 균등 해지면 받아 들일지 확실하지 않습니다. 위 예제에서 단순화 한 것이지만 실제로는 서로 다른 데이터를 검색하는 두 가지 쿼리가 있습니다. 결과가 일치해야합니다. TL에서 파티션 교환을 사용하도록 설득 할 수 있다면이 문제를 해결할 수 있습니까? –

+0

수정; 두 MV에 걸친 조인이있는 하나의 쿼리입니다. –

관련 문제