分类广告


推荐文章

  • 没有找到任何内容!
您当前的位置:中国站长下载数据库区其它相关 → 文章内容

使用查询改写提高查询性能

  • 作者:不详    来源:网络转载    发布时间:2006-5-29 9:16:58
  • 字体大小:

目录视图USER_TUNE_MVIEW将显示所得到的物化视图,如清单 13所示。尽管它看起
来与我们的原始物化视图有点不同,但在可以使用原始物化视图的地方,仍然可以使用该
物化视图改写任何查询,此外,还可以快速刷新。 
你也可以生成一个脚本来执行这些建议,你可能希望做的仅有修改就是改变物化视图的名称,以及指定物化视图应当放在哪里的存储语句和表空间。
现在,我们已经有了一个物化视图,但如果我们不知道创建什么物化视图,那么应当怎么办?这时,SQL Access Advisor可以帮助你,因为它会浏览你的系统,并它认为需要的索引和物化视图。
这些建议是基于实际的工作负荷或根据你的模式所做出的假设提出的。当提供了SQL语句的实际工作负荷时,将得到最好的结果。这一工作负荷可由SQL缓存的当前内容、SQL 调优集合(Tuning Set)、Oracle9i Summary Advisor工作负荷或用户提供的工作负荷表(包含你已经定义的SQL语句)获得。
SQL Access Advisor既可以通过命令行API使用,也可以通过企业管理器(Enterprise Manager)的一部分--SQL Access Advisor向导使用。使用该向导,在显示这些建议之前只需要完成三个步骤。让我们来看看如何通常命令行界面使用SQL Access Advisor: 
首先,创建一个包含,这一调优过程所有信息的任务。然后,该任务将利用工作负荷信息来生成作为任务的一部分存储的调优建议。因此,整个过程是完全独立的,而且允许各个任务稍有不同,以便人们能够看到对配置进行修改后的效果。在清单 14所示的示例中,是通过手工定义SQL语句对工作负荷进行定义的。
代码清单 14 

DECLARE

task_desc     VARCHAR2(100);
task_id       NUMBER;
task_name    VARCHAR2(30);
workload_name VARCHAR2(30);

BEGIN  

 task_name := ’Task_mag’;
 dbms_advisor.create_task (DBMS_ADVISOR.SQLACCESS_ADVISOR, 
task_id, task_name, ’My Advisor Task’,    DBMS_ADVISOR.SQLACCESS_WAREHOUSE);
 dbms_advisor.set_task_parameter (’Task_mag’, ’EVALUATION_ONLY’, ’FALSE’);
 dbms_advisor.set_task_parameter (’Task_mag’, ’EXECUTION_TYPE’, ’FULL’);

 -- create the workload
 workload_name :=’Workload_mv’;
 dbms_advisor.create_sqlwkld(workload_name, ’MV workload’ , NULL);
 -- now link the two together

 dbms_advisor.add_sqlwkld_ref(task_name, workload_name) ;
 -- add a SQL statement 
 dbms_advisor.add_sqlwkld_statement (workload_name,’App’,’action’,
                                      NULL,15,3000,423,507,60,704,
                                     3,’16-FEB-2002’,80,
                                     ’EASYDW’,
   ’SELECT  c.customer_id, c.town,

           COUNT(DISTINCT(product_id)) AS dist_promo_cnt
    FROM purchases ps, customer c
    WHERE ps.customer_id = c.customer_id
    GROUP BY c.customer_id, c.town’);
END;
/
一旦定义了工作负荷和任务,就可以生成如下所示的建议,该建议使用了EXECUTE_TASK 并指定了所创建任务的名字--Task_mag:

execute dbms_advisor.execute_task (’Task_mag’);

根据工作负荷的复杂性,生成建议的时间可以由几秒到几分钟不等。因此,尽管这个过程可以交互式运行,但你可能希望考虑提交一个任务,这就是企业管理器中的向导所要完成的工作。
你可以通过查询表USER_ADVISOR_RECOMMENDATIONS 来快速检查是否有关于task_name的建议。在对本例进行此操作时,我们会看到已经提出了一个建议。

 SELECT ’No of Recommendations:’ , COUNT(*) 
 FROM user_advisor_recommendations r    
 WHERE task_name=’Task_mag’;
’NOOFRECOMMENDATIONS:’   COUNT(*)
---------------------- ----------
No of Recommendations:          1

单个建议可以导致多个操作。对于此示例,SQL Access Advisor建议创建物化视图日志、一个CREATE MATERIALIZED VIEW,以及一个用来分析物化视图的调用(受版面限制,这里未给出)。
尽管你可以查询各种目录视图来查看这些操作,但查看它们的最简单方法就是生成一个脚本,如下所示: 

execute
dbms_advisor.create_file(dbms_advisor.get_task_script(’Task_mag’),
 ’ADVISOR_RESULTS’, ’mag_example.sql’);

在清单 15中,你可以看到该脚本的一段摘录,显示了为我们的查询所建立的物化视图。
代码清单 15 

Rem  Access Advisor 
Rem
Rem  Username:        EASYDW
Rem  Task:            My_Task
Rem  Execution date:  20/05/2003 14:36
Rem
...
CREATE MATERIALIZED VIEW "EASYDW"."MV$$_002D0000"
REFRESH FAST WITH ROWID
ENABLE QUERY REWRITE
AS SELECT EASYDW.PURCHASES.PRODUCT_ID C1,
          EASYDW.CUSTOMER.TOWN C2,
          EASYDW.CUSTOMER.CUSTOMER_ID C3, COUNT(*) M1
   FROM EASYDW.PURCHASES, EASYDW.CUSTOMER
   WHERE EASYDW.CUSTOMER.CUSTOMER_ID = EASYDW.PURCHASES.CUSTOMER_ID
   GROUP BY EASYDW.PURCHASES.PRODUCT_ID, EASYDW.CUSTOMER.TOWN,
            EASYDW.CUSTOMER.CUSTOMER_ID;
...
结论
通过使用查询改写,你可以利用几个物化视图显著改进许多查询的性能,从而减少了保持物化视图与基础细目数据同步所需要的磁盘空间占用与刷新时间

上一页  [1] [2] [3] [4]