Ein kleiner Test zur Semantik der Status-Angaben für Materialized Views in den relevanten Dictionary-Tabellen. Dabei geht es zunächst nur um die einfachsten Fälle (kein Query Rewrite, kein Fast Refresh):
-- 11.1.0.7 -- Aufbau Datenbasis drop table test_mpr; drop materialized view test_mv_mpr; create table test_mpr as select rownum id , mod(rownum, 10) col1 from dual connect by level <= 1000; create materialized view test_mv_mpr as select col1 , count(*) row_count from test_mpr group by col1; -- Analyse-Queries select object_name , object_type , status from dba_objects where object_name = 'TEST_MV_MPR'; select mview_name , invalid , known_stale , unusable from dba_mview_analysis where mview_name = 'TEST_MV_MPR'; select mview_name , staleness , compile_state from dba_mviews where mview_name = 'TEST_MV_MPR';
Dazu liefern die befragten Dictionary-Tabellen zunächst folgende Angaben:
-- dba_objects OBJECT_NAME OBJECT_TYPE STATUS --------------- ------------------- ------- TEST_MV_MPR MATERIALIZED VIEW VALID TEST_MV_MPR TABLE VALID -- dba_mview_analysis MVIEW_NAME INVALID KNOWN_STALE UNUSABLE --------------- ---------- ----------- ---------- TEST_MV_MPR N N N -- dba_mviews MVIEW_NAME STALENESS COMPILE_STATE --------------- ------------------- ------------- TEST_MV_MPR FRESH VALID
So weit keine Überraschungen: die MV ist frisch aufgebaut und alle Status-Angaben sind folglich im grünen Bereich. Was passiert, wenn ich die Basistabelle lösche:
drop table test_mpr; -- dba_objects OBJECT_NAME OBJECT_TYPE STATUS --------------- ------------------- ------- TEST_MV_MPR MATERIALIZED VIEW INVALID TEST_MV_MPR TABLE VALID -- dba_mview_analysis MVIEW_NAME INVALID KNOWN_STALE UNUSABLE --------------- ---------- ----------- ---------- TEST_MV_MPR Y N N -- dba_mviews MVIEW_NAME STALENESS COMPILE_STATE --------------- ------------------- ------------- TEST_MV_MPR NEEDS_COMPILE NEEDS_COMPILE
Auch diese Angaben erscheinen mir völlig nachvollziehbar: nach der Löschung der Basistabelle ist die MV tatsächlich in einer unglücklichen Situation, ein Refresh ist nicht mehr möglich, und der Status INVALID beschreibt das zutreffend. Nun ein weniger massiver Eingriff: ich füge in der Basis-Tabelle ein paar neue Datensätze ein, ändere an den Strukturen aber nichts:
insert into test_mpr select rownum id , mod(rownum, 10) col1 from dual connect by level <= 1000; commit; -- dba_objects OBJECT_NAME OBJECT_TYPE STATUS --------------- ------------------- ------- TEST_MV_MPR MATERIALIZED VIEW INVALID TEST_MV_MPR TABLE VALID -- dba_mview_analysis MVIEW_NAME INVALID KNOWN_STALE UNUSABLE --------------- ---------- ----------- ---------- TEST_MV_MPR Y N N -- dba_mviews MVIEW_NAME STALENESS COMPILE_STATE --------------- ------------------- ------------- TEST_MV_MPR NEEDS_COMPILE NEEDS_COMPILE
Die Status-Angaben sind in diesem Fall die gleichen wie im Fall der Löschung der Basis-Tabelle - und das finde ich nicht völlig plausibel, denn eigentlich würde ich erwarten, dass hier eine Unterscheidung möglich sein sollte. Die Einführung von weiteren Zustandsangaben wäre aus meiner Sicht kein Luxus gewesen.
Aus Gründen der Vollständigkeit hier noch die zugehörigenDefinitionen der Dokumentation:
Aus Gründen der Vollständigkeit hier noch die zugehörigenDefinitionen der Dokumentation:
- DBA_OBJECTS
- STATUS: Status of the object VALID, INVALID, N/A
- DBA_MVIEW_ANALYSIS
- INVALID: "Indicates whether this materialized view is in an invalid state (inconsistent metadata)"
- KNOWN_STALE: "Indicates whether the data contained in the materialized view is known to be inconsistent with the master table data because that has been updated since the last successful refresh"
- UNUSABLE: "Indicates whether this materialized view is UNUSABLE (inconsistent data) [...]. A materialized view can be UNUSABLE if a system failure occurs during a full refresh"
- DBA_MVIEWS:
- STALENESS: "Relationship between the contents of the materialized view and the contents of the materialized view's masters" Es folgen 5 Zustandsangaben, unter denen NEEDS_COMPILE allerdings nicht aufgeführt ist.
- COMPILE_STATE: "Validity of the materialized view with respect to the objects upon which it depends". Dazu gibt's 3 Zustände. Zu NEEDS_COMPILE heisst es: " Some object upon which the materialized view depends has changed. An ALTER MATERIALIZED VIEW...COMPILE statement is required to validate this materialized view"
Keine Kommentare:
Kommentar veröffentlichen