资源描述:
《oracle数据库中物化视图的原理剖析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Oracle数据库中物化视图的原理剖析物化视图(MV)在一个段中存储查询结果,并且能够在提交查询时将结果返回给用户,从而不再需要重新执行查询—在查询要执行几次时(这在数据仓库环境中非常常见),这是一个很大的好处。物化视图可以利用一个快速刷新机制从基础表中全部或增量刷新。假定您已经定义了一个物化视图,如下: creatematerializedviewmv_hotel_resv refreshfast enablequeryrewrite as selectdistinctcity,resv_id,cust_name fromhotels
2、h,reservationsr wherer.hotel_id=h.hotel_id'; 您如何才能知道已经为这个物化视图创建了其正常工作所必需的所有对象?在Oracle数据库10g之前,这是用DBMS_MVIEW程序包中的EXPLAIN_MVIEW和EXPLAIN_REWRITE过程来判断的。这些过程(在10g中仍然提供)非常简要地说明一种特定的功能—如快速刷新功能或查询重写功能—可能用于上述的物化视图,但不提供如何实现这些功能的建议。相反,需要对每一个物化视图的结构进行目视检查,这是非常不实际的。在10g中,新的DBMS_ADVISOR程序
3、包中的一个名为TUNE_MVIEW的过程使得这项工作变得非常容易:您利用IN参数来调用程序包,这构造了物化视图创建脚本的全部内容。该过程创建一个顾问程序任务(AdvisorTask),它拥有一个特定的名称,仅利用OUT参数就能够把这个名称传回给您。下面是一个例子。因为第一个参数是一个OUT参数,所以您需要在SQL*Plus中定义一个变量来保存它。 SQL>--首先定义一个变量来保存OUT参数 SQL>varadv_namevarchar2(20) SQL> begin 2 dbms_advisor.tune_mview 3 (
4、4 :adv_name, 5 'creatematerializedviewmv_hotel_resvrefreshfastenablequeryrewriteas selectdistinctcity,resv_id,cust_namefromhotelsh, reservationsrwherer.hotel_id=h.hotel_id'); 6*end; 现在您可以在该变量中找出顾问程序的名称。 SQL>printadv_name ADV_NAME ----------------------- TA
5、SK_117 接下来,通过查询一个新的DBA_TUNE_MVIEW来获取由这个顾问程序提供的建议。务必在运行该命令之前执行SETLONG999999,因为该视图中的列语句是一个CLOB,默认情况下只显示80个字符。 selectscript_type,statement from dba_tune_mview where task_name='TASK_117' order byscript_type,action_id; 下面是输出: SCRIPT_TYPE STATEMENT ---------------------
6、---------------------------------------------------- IMPLEMENTATIONCREATEMATERIALIZEDVIEWLOGON"ARUP"."HOTELS"WITHROWID, SEQUENCE("HOTEL_ID","CITY") INCLUDINGNEWVALUES IMPLEMENTATIONALTERMATERIALIZEDVIEWLOGFORCEON"ARUP"."HOTELS"ADD ROWID,SEQUENCE("HOTEL_ID","CITY") INCLUD
7、INGNEWVALUES IMPLEMENTATIONCREATEMATERIALIZEDVIEWLOGON"ARUP"."RESERVATIONS"WITH ROWID,SEQUENCE("RESV_ID","HOTEL_ID","CUST_NAME") INCLUDINGNEWVALUES IMPLEMENTATIONALTERMATERIALIZEDVIEWLOGFORCEON"ARUP"."RESERVATIONS" ADDROWID,SEQUENCE("RESV_ID","HOTEL_ID","CUST_NAME")
8、INCLUDINGNEWVALUES IMPLEMENTATIONCREATEMATERIALIZEDVIEWARU