如何在维度模型中使用Oracle物化视图

时间:2015-01-11 04:58:04

标签: oracle oracle11g data-warehouse materialized-views star-schema

我有一个带有大型事实表(数百万行)的维度模型,其范围按日期划分,而较小的维度表未分区。我遇到了在这些场景中经常使用的物化视图,以提高查询性能。

现在,我想知道以下哪两种方法更好,以利用这些物化视图来获取汇总报告。

一个。通过将整个事实表与所需的每个维度表连接起来创建一个。

create materialized view my_mview execute immediate query rewrite
    select 
       fact.col1, dim1.col2, dim2.col3, sum(fact.col4)
    from 
       my_fact fact 
    inner join
      my_dim1 dim1
       on fact.dim1_key = dim1.dim1_key
    inner join 
      my_dim2 dim2
       on fact.dim2_key = dim2.dim2_key group by fact.col1, dim1.col2, dim2.col3

这似乎是使用它们的最基本方式。但似乎     相反,我需要为每个人提供一个新的物化视图     我想要创建的查询的变体。

B中。在事实表的聚合上创建它,并在进行维度连接时利用查询重写。

create materialized view my_mview execute immediate query rewrite
    select 
       col1, dim1.dim2_key, dim2.dim_key, sum(fact.col4)
    from 
       my_fact fact 

在案例A中进行如上所述的连接,它将使用此聚合的物化视图进行连接,而不是整个事实表。

我可以告诉我何时使用每个案例或其他案例?

1 个答案:

答案 0 :(得分:0)

您的第一个示例与您描述的完全相同。

对于第二个示例,查询应为:

create materialized view my_mview execute immediate query rewrite
    select 
       col1, fact.dim2_key, fact.dim_key, sum(fact.col4)
    from 
       my_fact fact
    group by
       col1, fact.dim2_key, fact.dim_key

这将自动加速聚合,例如

select sum(fact.col4) 
  from fact

select fact.dim_key,sum(fact.col4) 
  from fact
  group by fact.dim_key

select fact.dim2_key,sum(fact.col4) 
  from fact
  group by fact.dim2_key

我不认为Oracle会自动将此第一类查询重写到此MV,因为在MV中,连接列已经被分组(它们也应该在第二个示例中分组)。它从未发生在我们身上。然而,这也可能取决于dim和fact表之间是否存在关系以及QUERY_REWRITE_INTEGRITY参数的值,因此这里仍有一些测试空间。

通过以特定方式编写查询,您仍可获得性能提升

WITH preaggr as (
    select 
       col1, fact.dim2_key, fact.dim_key, sum(fact.col4)
    from 
       my_fact fact
    group by
       col1, fact.dim2_key, fact.dim_key
)

select
  dim2.col1,
  sum(preaggr.col4)
from
  preaggr
join
  dim2
on
  preaggr.dim2_key = fact.dim2_key
group by  
  dim2.col1