﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-beauty_beast-随笔分类-oracle开发应用</title><link>http://www.blogjava.net/beauty_beast/category/8923.html</link><description>上善若水   厚德载物 
</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 01:01:06 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 01:01:06 GMT</pubDate><ttl>60</ttl><item><title>oracle 物化视图</title><link>http://www.blogjava.net/beauty_beast/archive/2006/03/28/37834.html</link><dc:creator>柳随风</dc:creator><author>柳随风</author><pubDate>Tue, 28 Mar 2006 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/beauty_beast/archive/2006/03/28/37834.html</guid><wfw:comment>http://www.blogjava.net/beauty_beast/comments/37834.html</wfw:comment><comments>http://www.blogjava.net/beauty_beast/archive/2006/03/28/37834.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beauty_beast/comments/commentRss/37834.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beauty_beast/services/trackbacks/37834.html</trackback:ping><description><![CDATA[
		<p>
				<font style="BACKGROUND-COLOR: #ffffff">最近两天在学习oracle物化视图，学了两天，总要输出一些学习心得，写的比较随意，本来想整理，但上次整理花了一天时间，目前还要更重要的事情，故先输出，有时间再整理。<br /><strong>使用场景</strong>：<br />              在只读或“精读”环境工作更好，不适用高端的联机处理系统，在并发事务不是很高的系统也可以使用<br /><strong>使用前提：</strong><br />              需要调整初始参数 query_rewrite_enabled，该参数可以动态调整，不需要重启<br />               alter system set query_rewrite_enabled=true;<br />              相关参数还有query_rewrite_integrity 该参数值有三个enforced、trusted、stale_tolerated 调整查询重写级别，enforced级别最低，是默认值。可重写查询的可能最小、（个人理解）<br /><strong>简单例子</strong>：<br />                create  materialized view  mview_owner_sum<br />                build immediate<br />                refresh on commit<br />                enable query rewrite<br />                as <br />                select count(*),owner from test<br />                 group by owner;<br /><br />oracle在数据更新后有可能（refresh on commit）自动重写物化视图，但不是能对任意的物化视图进行同步，对单一表或者没有聚集的连接可以重写。<br /><strong>查询重写：</strong><br />              如果查询语句符合如下相关条件，oracle优化器会从物化视图中查询，也就是查询重写。<br />              1、sql和定义视图的sql 完全匹配，可忽略空白字符大小以及其他格式<br />              2、部分正文匹配<br />              3、查询的数据可以从物化视图中提取出来<br />              4、连接兼容<br />              5、分组兼容<br />              6、聚集兼容<br />            （4、5、6的原则实际上就是做相关连接、分组、聚集相关数据全包含在物化视图中才能重写查询)<br />              7、另外在不同的优化策略下，是否查询重写是不一样的。在默认choose模式数据量不大的情况基本不会查询重写。<br /><br />根据上述原则，可通过如下的方法达到尽可能的查询重写，达到优化的目的：<br /><br />1、 尽可能的增加物化视图对应的基本表的之间的约束关系，如主键、外键，等，<br />这样查询是如果对应数据可从物化视图中提取出来，系统会有可能改写查询，采用物化视图<br />2、可以通过dimension对象可以指定相关表、字段之间的关系<br /><br /><strong>应用测试：<br /></strong>正好同事有相关的统计性能问题，用物化视图尝试了一把，查询的速度快了二十倍，但数据更新确要16秒，（视图是采用refresh on commit方式创建），不能解决该问题(数据量不大，做完表、索引分析后查询在0.5秒左右。<br /><br /><br /><br /><strong>遗留问题：<br /></strong>1、创建了维对象，对应的执行计划没有发生改变，没有达到创建维的目的<br />2、如果是 refresh on demand 方式创建的如何刷新数据。<br />3、缺乏详细的物化视图创建语法说明，只是达到基本了解物化视图的程度<br /><br /><br /><strong>相关学习脚本</strong>：<br />create materialized view mview_deptsum<br />build immediate<br />refresh on demand<br />enable query rewrite<br />as select a.deptno,a.dname,count(b.empno)<br />from dept a,emp b where a.deptno=b.deptno<br />group by a.deptno,a.dname</font>
		</p>
		<font style="BACKGROUND-COLOR: #ffffff">
				<p> </p>
				<p>create table sales(trans_date date,cust_id int,sales_smount number);</p>
				<p>insert /*+append */ into  sales<br />select trunc(sysdate,'year')+mod(rownum,366) trans_date,<br />mod(rownum,100) cust_id,<br />abs(dbms_random.random)/100 sales_smount from all_objects;</p>
				<p>
						<br />begin<br />for i in 1..4 loop<br />insert /*+append */ into  sales<br />select  trans_date,<br />cust_id,<br />abs(dbms_random.random)/100 sales_smount from sales;<br />commit;<br />end loop;<br />end;</p>
				<p> </p>
				<p>create table time_hierarchy<br />(day primary key,mmyyyy,mon_yyyy,qtr_yyyy,yyyy)<br />organization index<br />as <br />select distinct trans_date day,<br />cast(to_char(trans_date,'mmyyyy')as number) mmyyyy,<br />to_char(trans_date,'mon-yyyy') mon_yyyy, <br />'Q'||ceil(to_char(trans_date,'mm')/3)||'FY'<br />||to_char(trans_date,'yyyy') QTR_YYYY,<br />cast(to_char(trans_date,'yyyy') as number)yyyy<br />from sales;<br />/</p>
				<p> </p>
				<p>create materialized view mv_sales<br />build immediate<br />refresh on demand<br />enable query rewrite<br />as<br />select sales.cust_id,sum(sales.sales_smount),time_hierarchy.mm_yyyy<br />from sales,time_hierarchy<br />where sales.trans_date =time_hierarchy.day<br />group by sales.cust_id, time_hierarchy.mm_yyyy<br />/</p>
				<p>
						<br />select sum(sales.sales_smount),time_hierarchy.mmyyyy<br />from sales,time_hierarchy<br />where sales.trans_date =time_hierarchy.day<br />group by  time_hierarchy.mmyyyy</p>
				<p>
						<br />select sum(sales.sales_smount),time_hierarchy.qtr_yyyy<br />from sales,time_hierarchy<br />where sales.trans_date =time_hierarchy.day<br />group by  time_hierarchy.qtr_yyyy</p>
				<p> </p>
				<p>create dimension time_hierarchy_dim<br />level day is  time_hierarchy.day<br />level mmyyyy  is time_hierarchy.mmyyyy<br />level qtr_yyyy  is time_hierarchy.qtr_yyyy<br />level yyyy      is time_hierarchy.yyyy<br />hierarchy time_rollup<br />(<br />day child of<br />mmyyyy child of<br />qtr_yyyy child of<br />yyyy<br />)<br />attribute mmyyyy<br />determines mon_yyyy;<br /><br /><strong>篇外话</strong>：<br />           做测试导入的时候，对应表空间不存在，原本想通过收回创建无限空间的权限，<br />达到可以导入到用户对应表空间，结果不行，只好重新创建对应表空间导入。后来忘了赋予对应用户权限，结果今天创建物化视图报ora-01536  超过空间限量,初以为是表空间不够，实际是对应的用户没有无限使用表空间的权限alter user username quota unlimited on tablespacename。赋予权限后可创建，一切正常。<br /><br /><br /><br /><br /><br />              <br /></p>
		</font>
<img src ="http://www.blogjava.net/beauty_beast/aggbug/37834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beauty_beast/" target="_blank">柳随风</a> 2006-03-28 16:35 <a href="http://www.blogjava.net/beauty_beast/archive/2006/03/28/37834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle分析函数</title><link>http://www.blogjava.net/beauty_beast/archive/2006/03/24/37239.html</link><dc:creator>柳随风</dc:creator><author>柳随风</author><pubDate>Fri, 24 Mar 2006 08:50:00 GMT</pubDate><guid>http://www.blogjava.net/beauty_beast/archive/2006/03/24/37239.html</guid><wfw:comment>http://www.blogjava.net/beauty_beast/comments/37239.html</wfw:comment><comments>http://www.blogjava.net/beauty_beast/archive/2006/03/24/37239.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/beauty_beast/comments/commentRss/37239.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beauty_beast/services/trackbacks/37239.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Oracle 分析函数												------				本人《				expert one-to-one Oracle				》分析函数学习心得								实际应用																												我们在做项目中常遇到类似这样的统计需求				,				列出一些数据列表，最后来一个合计的...&nbsp;&nbsp;<a href='http://www.blogjava.net/beauty_beast/archive/2006/03/24/37239.html'>阅读全文</a><img src ="http://www.blogjava.net/beauty_beast/aggbug/37239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beauty_beast/" target="_blank">柳随风</a> 2006-03-24 16:50 <a href="http://www.blogjava.net/beauty_beast/archive/2006/03/24/37239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>