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

如何在维度模型中使用Oracle Materialized视图,oracle,oracle11g,data-warehouse,materialized-views,star-schema,Oracle,Oracle11g,Data Warehouse,Materialized Views,Star Schema,我有一个维度模型,其中有一个按日期进行范围分区的大型事实表(数百万行)和未分区的较小维度表。我遇到了物化视图,在这些场景中经常使用这些视图来提高查询性能 现在,我想知道以下两种方法中哪一种更好地利用这些物化视图来获得聚合报告 A.通过将整个事实表与所需的每个维度表连接起来,创建一个具有 create materialized view my_mview execute immediate query rewrite select fact.col1, dim1.col2,

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

现在,我想知道以下两种方法中哪一种更好地利用这些物化视图来获得聚合报告

A.通过将整个事实表与所需的每个维度表连接起来,创建一个具有

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中按上述方式进行连接,这将使用此聚合Materialized视图进行连接,而不是整个事实表


有人能告诉我什么时候我会使用每种情况吗?

您的第一个示例与您描述的完全一样

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

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和事实表之间是否定义了关系以及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