{"id":434,"date":"2009-02-13T10:58:48","date_gmt":"2009-02-13T15:58:48","guid":{"rendered":"http:\/\/jianmingli.com\/wp\/?p=434"},"modified":"2009-02-13T10:58:48","modified_gmt":"2009-02-13T15:58:48","slug":"oracle-materialized-view","status":"publish","type":"post","link":"https:\/\/jianmingli.com\/wp\/?p=434","title":{"rendered":"Oracle Materialized View"},"content":{"rendered":"<p>Basics<br \/>\n    -Also known as snapshots, or summaries<br \/>\n    -A materialized view creates a REAL table<br \/>\n    -A materialized view can query<br \/>\n        -tables,<br \/>\n        -views<br \/>\n        -other materialized views<\/p>\n<p>    -Underlying tables or views are called<br \/>\n        -mater tables<br \/>\n        -or detail tables<\/p>\n<p>    -You can<br \/>\n        -create index on mv<br \/>\n        -create mv on partitioned tables<br \/>\n        -partition a mv<\/p>\n<p>    -Oracle rewrites your queries to use mv based on<br \/>\n        -cost based optimization<br \/>\n            -so optimizing mv is the key for Oracle to use it<\/p>\n<p>    -Benefits<br \/>\n        -Beter performance<br \/>\n            -Less physical writes<br \/>\n            -Less writes<br \/>\n            -Decreased CPU comsumption<br \/>\n            -Faster response time<\/p>\n<p>    -Drawbacks<br \/>\n        -Need more disk space<\/p>\n<p>    -Best used in systems that are<br \/>\n        -Read only<br \/>\n        -Read intensive<\/p>\n<p>Query rewrite<br \/>\n    -For query rewrite to work<br \/>\n        -INIT.ORA<br \/>\n            -COMPATIBLE should be > 8.1.0<br \/>\n            -QUERY+REWRITE_ENABLED<br \/>\n            -QUERY REWRITE INTEGRITY<br \/>\n                -ENFORCED (default)<br \/>\n                -TRUSTED<br \/>\n                -STALE TOLERATED<br \/>\n        -System privileges<br \/>\n            -CREATE SESSION<br \/>\n            -CREATE TABLE<br \/>\n            -CREATE MATERIALIZED VIEW<br \/>\n            -QUERY REWRITE<br \/>\n        -Must use cost based optimizer (CBO)<br \/>\n        -Force query rewrite<br \/>\n            -By hint REWRITE_OR_ERROR<br \/>\n            -Use DBMS_MVIEW.EXPLAIN_REWRITE to find rewrite details<br \/>\n            -Example<br \/>\n                SELECT \/*+ REWRITE_OR_ERROR *\/<br \/>\n                     prod_id<br \/>\n                     SUM(quantity_sold) AS sum_sales_qty<br \/>\n                     FROM sales_data<br \/>\n                     GROUP BY prod_id<\/p>\n<p>Refreshing mv data<br \/>\n    -Refresh mode<br \/>\n        -on commit<br \/>\n        -on demand (default)<br \/>\n            -Use DBMS_MVIEW.REFRESH<br \/>\n    -Refresh type<br \/>\n        -COMPLETE<br \/>\n        -FAST<br \/>\n            -Relies on materialized view log table<br \/>\n        -FORCE (default)<br \/>\n            -Try FAST first, COMPLETE otherwise<br \/>\n        -NEVER    <\/p>\n<p>DBMS_MVIEW package<br \/>\n    -EXPLAIN_MVIEW<br \/>\n    -EXPLAIN_REWRITE<br \/>\n    -TUNE_MVIEW <\/p>\n<p>Create MV<br \/>\n    -Grant necessary privileges<br \/>\n        -CREATE MATERIALIZED VIEW<br \/>\n        -QUERY REWRITE<br \/>\n        -CREATE ANY TABLE<br \/>\n        -SELECT ANY TABLE <\/p>\n<p>    -Create mv log on master tables<br \/>\n        -CREATE MATERIALIZED VIEW LOG ON products;<\/p>\n<p>    -Create mv<br \/>\n        -Build mode<br \/>\n            -BUILD IMMEDIATE<br \/>\n            -BUILD DEFERRED <\/p>\n<p>    -Collect optimizer statistics for mv<br \/>\n        -analyze table mv_bigtab compute statistics;<\/p>\n<p>    -Example<br \/>\n        SQL> CREATE MATERIALIZED VIEW test_mv<br \/>\n          2  BUILD IMMEDIATE<br \/>\n          3  REFRESH FAST ON COMMIT<br \/>\n          4  ENABLE QUERY REWRITE<br \/>\n          5  AS<br \/>\n          6  SELECT sh.products.prod_category,<br \/>\n          7  SUM(sh.sales.quantity_sold),<br \/>\n          8  COUNT(sh.sales.quantity_sold), count(*)<br \/>\n         10  FROM sh.sales, sh.products<br \/>\n         11  WHERE sh.products.prod_id = sh.sales.prod_id<br \/>\n         12  AND sh.products.prod_category <= 'Women'\n         13  AND sh.products.prod_category >= &#8216;Boys&#8217;<br \/>\n         14  GROUP BY sh.products.prod_category;<br \/>\n         Materialized view created.<\/p>\n<p>Example<br \/>\n    -Setup big table named bigtab<br \/>\n        ALTER USER &#8220;SCOTT&#8221; ACCOUNT UNLOCK<br \/>\n        \/<\/p>\n<p>        set echo on<br \/>\n        set termout off<\/p>\n<p>        drop table bigtab;<\/p>\n<p>        create table bigtab<br \/>\n          nologging<br \/>\n          as<br \/>\n          select * from all_objects<br \/>\n          union all<br \/>\n          select * from all_objects<br \/>\n          union all<br \/>\n          select * from all_objects<br \/>\n        \/<\/p>\n<p>        insert \/*+ APPEND *\/ into bigtabd<br \/>\n        select * from bigtab;<br \/>\n        commit;<br \/>\n        insert \/*+ APPEND *\/ into bigtab<br \/>\n        select * from bigtab;<br \/>\n        commit;<br \/>\n        insert \/*+ APPEND *\/ into bigtab<br \/>\n        select * from bigtab;<br \/>\n        commit;<\/p>\n<p>        analyze table bigtab compute statistics;<\/p>\n<p>        select count(*) from bigtab;<br \/>\n    -Run query against bigtab<br \/>\n        set autotrace on<br \/>\n        set timing on<br \/>\n        select owner, count(*) from bigtab group by owner;<\/p>\n<p>    -Create materialized view<br \/>\n        -Run as system<br \/>\n            GRANT CREATE ANY MATERIALIZED VIEW TO &#8220;SCOTT&#8221;;<br \/>\n            GRANT QUERY REWRITE TO &#8220;SCOTT&#8221;;<\/p>\n<p>        alter session set query_rewrite_enabled=true;<br \/>\n        alter session set query_rewrite_integrity=enforced;<\/p>\n<p>        create materialized view mv_bigtab<br \/>\n          build immediate<br \/>\n          refresh on commit<br \/>\n          enable query rewrite<br \/>\n        as<br \/>\n        select owner, count(*)<br \/>\n          from bigtab<br \/>\n         group by owner<br \/>\n        \/<\/p>\n<p>        analyze table mv_bigtab compute statistics;<\/p>\n<p>    -Run query again bigtab again<br \/>\n        -Oracle automatically redirects the select count(*) to materialized views<br \/>\n        set timing on<br \/>\n        set autotrace traceonly<br \/>\n        select owner, count(*)<br \/>\n          from bigtab<br \/>\n         group by owner;<br \/>\n        set autotrace off<br \/>\n        set timing off<\/p>\n<p>    -Insert into bigtab<br \/>\n        -Materialized view automatically synchronized again bigtab table<br \/>\n            -REFRESH ON COMMIT<br \/>\n        insert into bigtab<br \/>\n          (owner, object_name, object_type, object_id)<br \/>\n          values (&#8216;Martin&#8217;, &#8216;Zahn&#8217;, &#8216;Akadia&#8217;, 1111111);<\/p>\n<p>        commit;<\/p>\n<p>        set timing on<br \/>\n        set autotrace traceonly<br \/>\n        select owner, count(*)<br \/>\n          from bigtab<br \/>\n         where owner = &#8216;Martin&#8217;<br \/>\n         group by owner;<br \/>\n        set autotrace off<br \/>\n        set timing off<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Basics -Also known as snapshots, or summaries -A materialized view creates a REAL table -A materialized view can query -tables, -views -other materialized views -Underlying tables or views are called -mater tables -or detail tables -You can -create index on &hellip; <a href=\"https:\/\/jianmingli.com\/wp\/?p=434\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[35],"tags":[],"class_list":["post-434","post","type-post","status-publish","format-standard","hentry","category-oracle"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8cRUO-70","_links":{"self":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/434","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=434"}],"version-history":[{"count":1,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/434\/revisions"}],"predecessor-version":[{"id":435,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/434\/revisions\/435"}],"wp:attachment":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=434"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}