无需改变sql查询就可以大幅提高查询性能.
在执行一个查询时,优化器会判定访问物化视图或数据驻留的基础表是否更快一些.如果优化器判定查询物化视图是更好的解决方案,那么优化器会在一个被称为“查询改写”(query rewrite)的过程中改写sql查询.在这个过程中,不需要对任何sql或应用程序代码进行修改,所以任何利用sql访问数据库的应用程序或特定查询工具都可得益于使用物化视图.当为计算结果而需要访问的数据数量远大于结果(如集合)的大小时,最适合使用查询改写,但是它也可被用于加速昂贵的联接或规划. 【程序编程相关:ResizableWindow源码】
你是否为等待你的查询返回结果而感到疲惫?你是否已经为增强索引与调优sql而感到疲惫,但仍然不能提高查询性能?那么,你是否已经考虑创建物化视图?有了物化视图,那些过去需要数小时运行的报告可以在几分钟内完成.物化视图可以包括联接(join)与集合(aggregate),它提供了一种储存预计算结果的方法. 【推荐阅读:关于JSF和Struts的讨论1】
查询改写类型 【扩展信息:WebService Behavior 】
本文首先介绍了优化器可以执行的查询改写类型.然后,它讨论了帮助确定创建最佳物化视图集的工具,使优化器能够改写多个查询.利用这些工具创建的物化视图在其基础数据发生变化时还可以快速刷新.如果你不知道创建一个物化视图.一个索引或同时创建两者哪种更好,那么在oracle数据库10g中引入的sql access advisor可以通过分析给定的工作负荷帮助你做出决定.
可能有许多类型的查询改写;当物化视图的定义查询与查询的文本完全匹配时,就发生最简单与最显著类型的查询改写.但是,当相同物化视图可用于相应多个查询时,就可以实现查询改写的最大好处.现在,我们将举例说明一些oracle优化器使用的规则,以确定它是否将使用物化视图来响应.
对于本文中的示例,可以考虑将一个星形模式中的purchases表看作事实表(fact table),其范围由time_key划分.维度表(dimension table)--time.product与customers--包含主键 time_key.product_id与cust_id.在purchases表中有引用各个维度表的外键约束.
考虑一下清单 1中所创建的物化视图,该视图按月按product_id计算销售总额与销售总次数.注意:对于用于查询改写的物化视图,必须有enable query rewrite子句.还有,初始化参数query_rewrite_enabled必须被设置为true.
代码清单 1:创建月销售物化视图
create materialized view monthly_sales_mv enable query rewrite as select t.month, p.product_id, sum(ps.purchase_price) as sum_of_sales, count (ps.purchase_price) as total_sales from time t, product p, purchases ps where t.time_key = ps.time_key and ps.product_id = p.product_id group by t.month, p.product_id;集合计算
在本文的示例中,我们将说明物化视图的查询并显示由explain plan得到的执行计划.清单 2中的查询要求按月与按产品的平均采购价格.优化器可以使用物化视图monthly_sales_mv,利用sum与count集合计算平均采购价格.这个示例说明了一种叫做“集合计算”的技术.
代码清单 2:获得平均(avg)采购价格
select t.month, p.product_id, avg(ps.purchase_price) as avg_sales from time t, product p, purchases ps where t.time_key = ps.time_key and ps.product_id = p.product_id group by t.month, p.product_id; id operation name ________________________________________________ select statement mat_view rewrite access full monthly_sales_mvjoinback
joinback技术非常有用,因为它允许当物化视图中没有列时进行查询改写.清单 3中的查询要求按月与按产品类别的销售总额,而该物化视图中并没有product.category列.然而,产品表的主键product_id列则位于物化视图中.因此,优化器可以将物化视图与产品表联接起来以得到产品类别.
代码清单 3:通过joinback获得销售总额
... 下一页