You are on page 1of 29

Materialized Views

ORACLE

07/25/08 Yadav, Naresh 1


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?
07/25/08 Yadav, Naresh 2
 Examples
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
07/25/08 Yadav, Naresh 3
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
07/25/08 Yadav, Naresh 4
 Storage costs of maintaining the views
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
07/25/08 Yadav, Naresh 5
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

07/25/08 Yadav, Naresh 6


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

07/25/08 Yadav, Naresh 7


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)

07/25/08 Yadav, Naresh 8


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

07/25/08 Yadav, Naresh 9


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

07/25/08 Yadav, Naresh 10


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
07/25/08 Yadav, Naresh 11
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;

07/25/08 Yadav, Naresh 12


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

07/25/08 Yadav, Naresh 13


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)

07/25/08 Yadav, Naresh 14


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)

07/25/08 Yadav, Naresh 15


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;

07/25/08 Yadav, Naresh 16


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

07/25/08 Yadav, Naresh 17


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

07/25/08 Yadav, Naresh 18


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 Yadav, Naresh
07/25/08 19
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);

07/25/08 Yadav, Naresh 20


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;

07/25/08 Yadav, Naresh 21


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);

07/25/08 Yadav, Naresh 22


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;

07/25/08 Yadav, Naresh 23


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)

07/25/08 Yadav, Naresh 24


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)

07/25/08 Yadav, Naresh 25


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
07/25/08
queries Yadav, Naresh 26
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

07/25/08 Yadav, Naresh 27


Rqmts For FAST REFRESH (cont’d)
Joins & Single Table
Requirement Joins Only
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
the materialized view, and it must have been created with the LOG X
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

07/25/08 Yadav, Naresh 28


Materialized Views

07/25/08 Yadav, Naresh 29

You might also like