我有一个带有大型事实表(数百万行)的维度模型,其范围按日期划分,而较小的维度表未分区。我遇到了在这些场景中经常使用的物化视图,以提高查询性能。
现在,我想知道以下哪两种方法更好,以利用这些物化视图来获取汇总报告。
一个。通过将整个事实表与所需的每个维度表连接起来创建一个。
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中进行如上所述的连接,它将使用此聚合的物化视图进行连接,而不是整个事实表。
我可以告诉我何时使用每个案例或其他案例?
答案 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