2013-11-20 11 views
8

I erstellte Tabellen DEPT und EMP wie folgt:Schnelle Aktualisierung auf begehen von materialisierten Ansicht

create table DEPT 
(dept_no number , dept_name varchar(32) , dept_desc varchar(32), 
    CONSTRAINT dept_pk Primary Key (dept_no)); 

create table EMP 
(emp_no number, dept_no number, CONSTRAINT emp_pk Primary Key (emp_no,dept_no)); 

insert into dept values (10,'it','desc1'); 
insert into dept values (20,'hr','desc2'); 

insert into emp values (1,10); 
insert into emp values (2,20); 

ich materialisierte Ansicht Protokolle auf diesen Tabellen mit Rowid erstellt und materialisierte Ansichten wie folgt:

create materialized view log on emp with rowid; 
create materialized view log on dept with rowid; 

create materialized view empdept_mv refresh fast on commit as 
select a.rowid dept_rowid, b.rowid emp_rowid, a.dept_no,b.emp_no 
from dept a, emp b 
where a.dept_no=b.dept_no ; 

select * from emp; 
    EMP_NO DEPT_NO 
    ---------- ---------- 
    1   10 
    2   20 
    3   30 

select * from dept; 
    DEPT_NO DEPT_NAME      DEPT_DESC 
---------- -------------------------------- -------------------------------- 
    10 it        desc1 
    20 hr        desc2 
    30 it        desc3 

select * from empdept_mv; 

DEPT_ROWID   EMP_ROWID    DEPT_NO  EMP_NO 
------------------ ------------------ ---------- ---------- 
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA   10   1 
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB   20   2 

Ich habe einen neuen Datensatz eingefügt und COMMIT ausgeführt. .. aber wenn ich die materialisierte Ansicht überprüfe, wird der neue Datensatz in der materialisierten Ansicht nicht angezeigt.

insert into dept values (30,'it','desc3'); 
commit; 
insert into emp values (3,30); 
commit; 

select * from empdept_mv; 

DEPT_ROWID   EMP_ROWID    DEPT_NO  EMP_NO 
------------------ ------------------ ---------- ---------- 
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA   10   1 
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB   20   2 

Nun, wenn ich das Verfahren für die schnelle und vollständige Auffrischung als per laufen, The Fast Refresh aktualisiert nicht die Mview aber die komplette Auffrischung tut. (Anmerkung: Aber die Mview noch REFRESH ON COMMIT)

execute DBMS_MVIEW.REFRESH('empdept_mv', 'F', '', TRUE, FALSE, 0,0,0,FALSE, FALSE); 
PL/SQL procedure successfully completed. 

DEPT_ROWID   EMP_ROWID    DEPT_NO  EMP_NO 
------------------ ------------------ ---------- ---------- 
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA   10   1 
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB   20   2 


execute DBMS_MVIEW.REFRESH('test_mview2', 'C', '', TRUE, FALSE, 0,0,0,FALSE, FALSE); 
PL/SQL procedure successfully completed. 

DEPT_ROWID   EMP_ROWID    DEPT_NO  EMP_NO 
------------------ ------------------ ---------- ---------- 
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA   10   1 
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB   20   2 
AAAli5AABAAAPZ6AAC AAAli7AABAAAQs6AAC   30   3 

DBMS_MVIEW.EXPLAIN_MVIEW Der Ausgang ist wie folgt: (capability_name --Possible-- msgtxt)

  1. PCT --N- -
  2. REFRESH_COMPLETE -Y-
  3. REFRESH_FAST -Y-
  4. REWRITE -N-
  5. PCT_TABLE -N- Oracle-Fehler: siehe RELATED_NUM und RELATED_TEXT für Details
  6. REFRESH_FAST_AFTER_INSERT -Y-
  7. REFRESH_FAST_AFTER_ONETAB_DML -Y-
  8. REFRESH_FAST_AFTER_ANY_DML -Y-
  9. REFRESH_FAST_PCT - N-- PCT ist nicht möglich, auf alle von der Detail Tabellen in der mater
  10. REWRITE_FULL_TEXT_MATCH -N- Oracle-Fehler: siehe RELATED_NUM und RELATED_TEXT für Details
  11. REWRITE_FULL_TEXT_MATCH -N- Umschreiben von Abfragen ist d isabled auf der materialisierte Ansicht
  12. REWRITE_PARTIAL_TEXT_MATCH -N- Ansicht nicht unterstützen materialisiert kann jede Art von Abfrage neu schreiben
  13. REWRITE_PARTIAL_TEXT_MATCH -N- Umschreiben von Abfragen deaktiviert ist auf die materialisierte Ansicht
  14. REWRITE_GENERAL --N - materialisierte Ansicht nicht jede Art von Abfrage neu schreiben
  15. REWRITE_GENERAL -N- umschreiben von Abfragen auf die materialisierte Ansicht
  16. REWRITE_PCT -N- allgemeine Rewrite ist oder PCT nicht möglich ist deaktiviert unterstützen kann ist nicht möglich auf einem
  17. PCT_TABLE_REWRITE -N- Oracle-Fehler: siehe RELATED_NUM und RELATED_TEXT für Details

Wie kann ich schnell Refresh erreichen On Commit?
Die Oracle Version-Details lauten wie folgt:
NLSRTL 10.2.0.4.0 Produktion
Oracle Database 10g 10.2.0.4.0 64-Bit-Produktion
PL/SQL 10.2.0.4.0 Produktion
TNS für Linux: 10.2.0.4.0 Produktion

+0

Es funktioniert für mich. Vielleicht möchten Sie Ihr 'materialisiertes Ansichtsprotokoll erstellen ...' und Ihre Einsätze hinzufügen, damit wir das Problem vollständig reproduzieren können. –

+0

Sie haben keine Daten angezeigt und auch nicht angegeben, in welche Tabelle Sie die Zeile eingefügt haben. Wird die neue Zeile angezeigt, wenn Sie die Select-Anweisung ausführen, die die MV-Abfrage definiert? –

+0

Ich habe alle Insert-Anweisungen enthalten. Ja, ich kann die neue Zeile nach dem Einfügen in der Tabelle sehen. –

Antwort

1

Ich sehe, dass Sie die materialisierte Ansicht Protokolle erstellt mit ROWID, die nicht wirklich erforderlich ist, da beide Tabellen einen Primärschlüssel haben, so dass Sie ohne die ROWID versuchen könnten.

erstellen materialisierte Ansicht anmelden emp; erstellen materialisierte Ansicht anmelden Dept;

Wenn Sie zusätzlich das materialisierte Ansichtsprotokoll mit ROWID erstellen, sollten Sie die materialisierte Ansicht mit Rowid erstellen.

materialisierte Ansicht create empdept_mv schnell auf refresh zu begehen MIT ROWID als wählen a.rowid dept_rowid, b.rowid emp_rowid, a.dept_no, b.emp_no aus dept a, b emp wo a.dept_no = b.dept_no ;

Sie könnten diese Änderungen versuchen und sehen, ob die materialisierten Ansichten beim Commit schnell aktualisiert werden.

2

ich weiß nicht, ob das Problem weiterhin besteht, aber als ich am artice einen Blick nahm Sie zur Verfügung gestellt, bemerkte ich etwas (was gerade hier die Lösung sein könnte):

ON Refresh COMMIT

Eine materialisierte Ansicht kann mithilfe der ON COMMIT-Methode automatisch aktualisiert werden. Wenn eine Transaktion festgeschrieben wird, die die Tabellen aktualisiert hat, für die eine materialisierte Ansicht definiert ist, werden diese Änderungen automatisch in der materialisierten Ansicht angezeigt. Der Vorteil dieses Ansatzes besteht darin, dass Sie nie daran denken müssen, die materialisierte Ansicht zu aktualisieren. Der einzige Nachteil ist, dass die Zeit, die für die Ausführung des Commits benötigt wird, wegen der zusätzlichen Verarbeitung etwas länger ist. In einem Data Warehouse sollte dies jedoch kein Problem darstellen, da es unwahrscheinlich ist, dass gleichzeitige Prozesse versuchen, die gleiche Tabelle zu aktualisieren.

  • Beachten Sie die fett gedruckte Zeile.

Dann haben wir:

Tabelle 7-1 ON DEMAND Refresh Methoden

Refresh Option Parameter Beschreibung COMPLETE C Erfrischt durch die definierende Abfrage der materialisierten Ansicht neu berechnet .

FAST F Erfrischt durch inkrementelles Änderungen an der materialisierten Ansicht anwenden. Für lokale materialisierte Ansichten wird die Aktualisierungsmethode ausgewählt, die vom Optimierungsprogramm als am effizientesten bewertet wird. Die betrachteten Aktualisierungsmethoden sind protokollbasiert FAST und FAST_PCT.

FAST_PCT P Aktualisiert durch Neuberechnung der Zeilen in der materialisierten Ansicht, die von geänderten Partitionen in den Detailtabellen betroffen sind.

FORCE? Versucht eine schnelle Aktualisierung. Wenn dies nicht möglich ist, wird eine vollständige Aktualisierung durchgeführt. Für lokale materialisierte Ansichten wird die Aktualisierungsmethode ausgewählt, die vom Optimierer als am effizientesten eingeschätzt wird. Die betrachteten Aktualisierungsmethoden sind protokollbasiert FAST, FAST_PCT und COMPLETE.

  • Beachten Sie die fett gedruckten Zeilen.
  • Ich persönlich bevorzuge die Option FORCE.

Könnten Sie bitte erklären, wenn diese nach einiger Zeit wieder auftritt (in Abhängigkeit von den Parametern der DB und der Maschine das er läuft, so kann ich Ihnen, wie viel nicht einmal andeuten)?

Wenn schnelle Refresh möglich ist

alle nicht materialisierte Ansichten können schnell aktualisierbare sein. Verwenden Sie daher das Paket DBMS_MVIEW.EXPLAIN_MVIEW, um festzustellen, welche Aktualisierungsmethoden für eine materialisierte Ansicht verfügbar sind.

Wenn Sie nicht sicher sind, wie eine materialisierte Ansicht schnell aktualisierbare zu machen, können Sie die DBMS_ADVISOR.TUNE_MVIEW Verfahren verwenden, die ein Skript erforderlich mit den Anweisungen ermöglichen eine schnelle aktualisierbare materialisierte Ansicht zu erstellen.

Prost