Freitag, November 23, 2012

Status einer Materialized View

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:
  • 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