You are on page 1of 30

Materialized Views

Willie Albino May 15, 2003
Materialized Views – Agenda

 What is a Materialized View?
– Advantages and Disadvantages
 How Materialized Views Work
– Parameter Settings, Privileges, Query Rewrite
 Creating Materialized Views
– Syntax, Refresh Modes/Options, Build Methods
– Examples
 Dimensions
– What are they?
– Examples

2 Willie Albino May 15, 2003
What is a Materialized View?

 A database object that stores the results of a query
– Marries the query rewrite features found in Oracle
Discoverer with the data refresh capabilities of snapshots

 Features/Capabilities
– Can be partitioned and indexed
– Can be queried directly
– Can have DML applied against it
– Several refresh options are available
– Best in read-intensive environments

3 Willie Albino May 15, 2003
Advantages and Disadvantages

 Advantages
– Useful for summarizing, pre-computing, replicating and
distributing data
– Faster access for expensive and complex joins
– Transparent to end-users
 MVs can be added/dropped without invalidating coded SQL

 Disadvantages
– Performance costs of maintaining the views
– Storage costs of maintaining the views

4 Willie Albino May 15, 2003
Database Parameter
Settings

 init.ora parameter
– COMPATIBLE=8.1.0 (or above)
 System or session settings
– query_rewrite_enabled={true|false}
– query_rewrite_integrity=
{enforced|trusted|stale_tolerated}
 Can be set for a session using
– alter session set query_rewrite_enabled=true;
– alter session set query_rewrite_integrity=enforced;
 Privileges which must be granted to users directly
– QUERY_REWRITE - for MV using objects in own schema
– GLOBAL_QUERY_REWRITE - for objects in other schemas

5 Willie Albino May 15, 2003
Query Rewrite Details

 query_rewrite_integrity Settings:
– enforced – rewrites based on Oracle enforced
constraints
 Primary key, foreign keys
– trusted – rewrites based on Oracle enforced constraints
and known, but not enforced, data relationships
 Primary key, foreign keys
 Data dictionary information
 Dimensions

– stale_tolerated – queries rewritten even if Oracle
knows the mv’s data is out-of-sync with the detail data
 Data dictionary information

6 Willie Albino May 15, 2003
Query Rewrite Details (cont’d)

 Query Rewrite Methods
– Full Exact Text Match
 Friendlier/more flexible version of text matching
– Partial Text Match
 Compares text starting at FROM clause
 SELECT clause must be satisfied for rewrite to occur

– Data Sufficiency
 All required data must be present in the MV or retrievable
through a join-back operation
– Join Compatibility
 All joined columns are present in the MV

7 Willie Albino May 15, 2003
Query Rewrite Details (cont’d)

– Grouping Compatibility
 Allows for matches in groupings at higher levels than
those defined MV query
 Required if both query and MV contain a GROUP BY
clause
– Aggregate Compatibility
 Allows for interesting rewrites of aggregations
– If SUM(x) and COUNT(x) are in MV, the MV may be
used if the query specifies AVG(x)

8 Willie Albino May 15, 2003
Syntax For Materialized Views

CREATE MATERIALIZED VIEW <name>
TABLESPACE <tbs name> {<storage parameters>}
<build option>
REFRESH <refresh option> <refresh mode>
[ENABLE|DISABLE] QUERY REWRITE
AS
SELECT <select clause>;

The <build option> determines when MV is built
– BUILD IMMEDIATE: view is built at creation time
– BUILD DEFFERED: view is built at a later time
– ON PREBUILT TABLE: use an existing table as view source
Must set QUERY_REWRITE_INTEGRITY to TRUSTED

9 Willie Albino May 15, 2003
Materialized View Refresh Options

 Refresh Options
– COMPLETE – totally refreshes the view
 Can be done at any time; can be time consuming

– FAST – incrementally applies data changes
 A materialized view log is required on each detail table
 Data changes are recorded in MV logs or direct loader logs
 Many other requirements must be met for fast refreshes
– FORCE – does a FAST refresh in favor of a COMPLETE
 The default refresh option

10 Willie Albino May 15, 2003
Materialized View Refresh Modes

 Refresh Modes
– ON COMMIT – refreshes occur whenever a commit is
performed on one of the view’s underlying detail table(s)
 Available only with single table aggregate or join based views
 Keeps view data transactionally accurate
 Need to check alert log for view creation errors
– ON DEMAND – refreshes are initiated manually using one of
the procedures in the DBMS_MVIEW package
 Can be used with all types of materialized views
 Manual Refresh Procedures
– DBMS_MVIEW.REFRESH(<mv_name>, <refresh_option>)
– DBMS_MVIEW.REFRESH_ALL_MVIEWS()
– START WITH [NEXT] <date> - refreshes start at a specified
date/time and continue at regular intervals
11 Willie Albino May 15, 2003
Materialized View Example

CREATE MATERIALIZED VIEW items_summary_mv
ON PREBUILT TABLE
REFRESH FORCE AS
SELECT a.PRD_ID, a.SITE_ID, a.TYPE_CODE, a.CATEG_ID,
sum(a.GMS) GMS,
sum(a.NET_REV) NET_REV,
sum(a.BOLD_FEE) BOLD_FEE,
sum(a.BIN_PRICE) BIN_PRICE,
sum(a.GLRY_FEE) GLRY_FEE,
sum(a.QTY_SOLD) QTY_SOLD,
count(a.ITEM_ID) UNITS
FROM items a
GROUP BY a.PRD_ID, a.SITE_ID, a.TYPE_CODE, a.CATEG_ID;

ANALYZE TABLE item_summary_mv COMPUTE STATISTICS;

12 Willie Albino May 15, 2003
Materialized View Example (cont’d)

-- Query to test impact of materialized view

select categ_id, site_id,
sum(net_rev),
sum(bold_fee),
count(item_id)
from items
where prd_id in ('2000M05','2000M06','2001M07','2001M08')
and site_id in (0,1)
and categ_id in (2,4,6,8,1,22)
group by categ_id, site_id

save mv_example.sql

13 Willie Albino May 15, 2003
Materialized View Example (cont’d)

SQL> ALTER SESSION SET QUERY_REWRITE_INTEGRITY=TRUSTED;
SQL> ALTER SESSION SET QUERY_REWRITE_ENABLED=FALSE;
SQL> @mv_example.sql

CATEG_ID SITE_ID SUM(NET_REV) SUM(BOLD_FEE) COUNT(ITEM_ID)
-------- ------- ------------ ------------- --------------
1 0 -2.35 0 1
22 0 -42120.87 -306 28085

Elapsed: 01:32:17.93

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=360829 Card=6 Bytes=120)
1 0 SORT (GROUP BY) (Cost=360829 Card=6 Bytes=120)
2 1 PARTITION RANGE (INLIST
3 2 TABLE ACCESS (FULL) OF ‘ITEMS' (Cost=360077
Card=375154 Bytes=7503080)

14 Willie Albino May 15, 2003
Materialized View Example (cont’d)

SQL> ALTER SESSION SET QUERY_REWRITE_ENABLED=TRUE;
SQL> @mv_example.sql

CATEG_ID SITE_ID SUM(NET_REV) SUM(BOLD_FEE) COUNT(ITEM_ID)
-------- ------- ------------ ------------- --------------
1 0 -2.35 0 1
22 0 -42120.87 -306 28085
Elapsed: 00:01:40.47

Execution Plan
----------------------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=3749 Card=12 Bytes=276)
1 0 SORT (GROUP BY) (Cost=3749 Card=12 Bytes=276)
2 1 PARTITION RANGE (INLIST)
3 2 TABLE ACCESS (FULL) OF ‘ITEMS_SUMMARY_MV'
(Cost=3723 Card=7331 Bytes=168613)

15 Willie Albino May 15, 2003
Example of FAST REFRESH MV

CREATE MATERIALIZED VIEW LOG ON ITEMS
TABLESPACE MV_LOGS STORAGE(INITIAL 10M NEXT 10M) WITH ROWID;

CREATE MATERIALIZED VIEW LOG ON CUSTOMERS
TABLESPACE MV_LOGS STORAGE(INITIAL 1M NEXT 1M) WITH ROWID;

CREATE MATERIALIZED VIEW cust_activity
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT u.ROWID cust_rowid, l.ROWID item_rowid,
u.cust_id, u.custname, u.email,
l.categ_id, l.site_id, sum(gms), sum(net_rev_fee)
FROM customers u, items l
WHERE u.cust_id = l.seller_id
GROUP BY u.cust_id, u.custname, u.email, l.categ_id, l.site_id;

16 Willie Albino May 15, 2003
Getting Information About an MV

Getting information about the key columns of a materialized view:
SELECT POSITION_IN_SELECT POSITION,
CONTAINER_COLUMN COLUMN,
DETAILOBJ_OWNER OWNER,
DETAILOBJ_NAME SOURCE,
DETAILOBJ_ALIAS ALIAS,
DETAILOBJ_TYPE TYPE,
DETAILOBJ_COLUMN SRC_COLUMN
FROM USER_MVIEW_KEYS
WHERE MVIEW_NAME=‘ITEMS_SUMMARY_MV’;

POS COLUMN OWNER SOURCE ALIAS TYPE SRC_COLUMN
--- ---------- ----- -------- ----- ------ -----------
1 PRD_ID TAZ ITEMS A TABLE PRD_ID
2 SITE_ID TAZ ITEMS A TABLE SITE_ID
3 TYPE_CODE TAZ ITEMS A TABLE TYPE_CODE
4 CATEG_ID TAZ ITEMS A TABLE CATEG_ID

17 Willie Albino May 15, 2003
Getting Information About an MV

Getting information about the aggregate columns of a materialized
view:

SELECT POSITION_IN_SELECT POSITION,
CONTAINER_COLUMN COLUMN,
AGG_FUNCTION
FROM USER_MVIEW_AGGREGATES
WHERE MVIEW_NAME=‘ITEMS_SUMMARY_MV’;

POSITION COLUMN AGG_FUNCTION
-------- ----------------- ------------
6 GMS SUM
7 NET_REV SUM
: : :
11 QTY_SOLD SUM
12 UNITS COUNT

18 Willie Albino May 15, 2003
Dimensions

 A way of describing complex data relationships
– Used to perform query rewrites, but not required
– Defines hierarchical relationships between pairs of columns
 Hierarchies can have multiple levels
 Each child in the hierarchy has one and only one parent
 Each level key can identify one or more attribute
 Child join keys must be NOT NULL

 Dimensions should be validated using the
DBMS_OLAP.VALIDATE_DIMENSION package
– Bad row ROWIDs stored in table: mview$_exceptions

19 Willie Albino May 15, 2003
Syntax For Creating A Dimension

CREATE DIMENSION <dimension name>
LEVEL [<level> IS <level_table.level_column>
<level> IS <level_table.level_column>…]
HIERARCHY <hierarchy_name>
( <child_level> CHILD OF <parent_level>
<child_level> CHILD OF <parent_level>…]
ATTRIBUTE <level> DETERMINES <dependent_column>
<level> DETERMINES <dependent_column>,…);

To validate a dimension:
exec dbms_olap.validate_dimension(<dim_name>,<owner>,FALSE,FALSE);

20 Willie Albino May 15, 2003
Example of Creating A Dimension

CREATE DIMENSION time_dim
LEVEL CAL_DATE IS calendar.CAL_DATE
LEVEL PRD_ID IS calendar.PRD_ID
LEVEL QTR_ID IS calendar.QTR_ID
LEVEL YEAR_ID IS calendar.YEAR_ID
LEVEL WEEK_IN_YEAR_ID IS calendar.WEEK_IN_YEAR_ID
HIERARCHY calendar_rollup
(CAL_DATE CHILD OF
PRD_ID CHILD OF
QTR_ID CHILD OF YEAR_ID)
HIERARCHY week_rollup
(CAL_DATE CHILD OF
WEEK_IN_YEAR_ID CHILD OF YEAR_ID)
ATTRIBUTE PRD_ID DETERMINES PRD_DESC
ATTRIBUTE QTR_ID DETERMINES QTR_DESC;

21 Willie Albino May 15, 2003
Example of Validating A Dimension

SQL> exec dbms_olap.validate_dimension(‘time_dim’, USER, FALSE, FALSE);

PL/SQL procedure successfully completed.

SQL> select * from mview$_exceptions;
no rows selected.

-- Main cause of errors is a child level having multiple parents
-- If above query returns rows, the bad rows can be found as follows:

select * from calendar
where rowid in
(select bad_rowid from mview$_exceptions);

22 Willie Albino May 15, 2003
Example of Using Dimensions

-- Step 1 of 4
-- Create materialized view (join-aggregate type)
CREATE MATERIALIZED VIEW items_mv
BUILD IMMEDIATE
REFRESH ON DEMAND
ENABLE QUERY REWRITE
AS
SELECT l.slr_id ,
c.cal_date,
sum(l.gms) gms
FROM items l,
calendar c
WHERE
l.end_date=c.cal_date
GROUP BY
l.slr_id, c.cal_date;

23 Willie Albino May 15, 2003
Example of Using Dimensions
(cont’d)

-- Step 2 of 4: (not really required, for demonstration only)

-- Execute query based on “quarter”, not “date”, without a time dimension
-- Note that the detail tables are accessed

SQL> select c.qtr_id, sum(l.gms) gms
2 from items l, calendar c
3 where l.end_date=c.cal_date
4 group by l.slr_id, c.qtr_id;

Execution Plan
----------------------------------------------------------
SELECT STATEMENT Optimizer=CHOOSE (Cost=16174 Card=36258 Bytes=1160256)
SORT (GROUP BY) (Cost=16174 Card=36258 Bytes=1160256)
HASH JOIN (Cost=81 Card=5611339 Bytes=179562848)
TABLE ACCESS (FULL) OF ’CALENDAR' (Cost=2 Card=8017 Bytes=128272)
TABLE ACCESS (FULL) OF ’ITEMS' (Cost=76 Card=69993 Bytes=1119888)

24 Willie Albino May 15, 2003
Example of Using Dimensions
(cont’d)

-- Step 3 of 4: Create time dimension (see slide #21 for SQL)
@cr_time_dim.sql
Dimension Created
-- Step 4 of 4: Rerun query based on “quarter” with time dimension

SQL> select c.qtr_id, sum(l.gms) gms
2 from items l, calendar c
3 where l.end_date=c.cal_date
4 group by l.slr_id, c.qtr_id;

Execution Plan
----------------------------------------------------------
SELECT STATEMENT Optimizer=CHOOSE (Cost=3703 Card=878824 Bytes=44820024)
SORT (GROUP BY) (Cost=3703 Card=878824 Bytes=44820024)
HASH JOIN (Cost=31 Card=878824 Bytes=44820024)
VIEW (Cost=25 Card=8017 Bytes=128272)
SORT (UNIQUE) (Cost=25 Card=8017 Bytes=128272)
TABLE ACCESS (FULL) OF ‘CALENDAR’ (Cost=2 Card=8017 Bytes=128272)
TABLE ACCESS (FULL) OF ‘ITEMS_MV’ (Cost=3 Card=10962 Bytes=383670)

25 Willie Albino May 15, 2003
Summary

 Materialized Views
– reduce system cpu/io resource requirements by pre-
calculating and storing results of intensive queries
– allow for the automatic rewriting of intensive queries
– are transparent to the application
– have storage/maintenance requirements
– can understand complex data relationships
– can be refreshed on demand or on a schedule
 Dimensions
– allow you to “tell” Oracle about complex data
relationships which can be used to rewrite queries

26 Willie Albino May 15, 2003
References

 Using Oracle9i Materialized Views (Technet Oracle By Example)
– http://technet.oracle.com/products/oracle9i/htdocs/9iober2/obe9ir2/obe-dwh/html/m

 Oracle Expert-One-On-One – Thomas Kyte

 The Secrets of Materialized Views
– http://www.akadia.com/services/ora_materialized_views.html

 OLAP DB-Design with Dimensions
– http://www.akadia.com/services/ora_olap_dimensions.html

 The Secrets of Dimensions
– http://www.akadia.com/services/ora_dimensions.html

27 Willie Albino May 15, 2003
28 Willie Albino May 15, 2003
Requirements for FAST REFRESH

Requirement Joins Only Joins & Single Table
Aggregates Aggregates

Must be based on detail tables only X X X
Must be based on a single table X
Each table can appear only once in the FROM list X X X
Cannot contain nonrepeating expressions (ROWNUM, SYSDATE, etc) X X X
Cannot contain references to RAW or LONG RAW X X X
Cannot contain the GROUP BY clause X
The SELECT list must include the ROWIDs of all the detail tables X
Expressions can be included in the GROUP BY and SELECT clause as X X
long as they are the same in each
Aggregates are allowed but cannot be nested X X
If SELECT clause contains AVG, it must also contain COUNT X X
If SELECT clause contains SUM, it must also contain COUNT X
If SELECT clause contains VARIANCE, it must also contain COUNT X X
and SUM
If SELECT clause contains STDDEV, it must also contain COUNT and X
SUM
The join predicates of the WHERE clause can included AND but not OR X
The HAVING and CONNECT BY clauses are not allowed X X X

29 Willie Albino May 15, 2003
Rqmts For FAST REFRESH (cont’d)

Requirement Joins Only Joins & Single Table
Aggregates Aggregates

Sub-queries, inline views, or set functions such as UNION are not X X X
allowed
A WHERE clause is not allowed X
COUNT(*) must be present X
MIN and MAX are not allowed X
Unique constraints must exist on the join columns of the inner table, if X
an outer join is used
A materialized view log must exist that contains all column referenced in X
the materialized view, and it must have been created with the LOG
NEW VALUES clause
A materialized view log containing ROWID must exist for each detail X
table
Any non aggregate expressions in the SELECT and GROUP BY X
clauses must be non-modified columns
DML allowed on detailed tables X X
Direct path data load allowed X X X

30 Willie Albino May 15, 2003