甲骨文中的物化视图与临时表



我有一个基本事务表。然后,我有大约 15 个中间步骤,在这些步骤中,我将组合维度表、执行一些聚合并实现业务逻辑。我目前的处理方式是为中间阶段创建临时表,并将这 15 个步骤填充到物理表中。这是一种更好的方法,或者使用物化视图而不是这些中间临时表是一种更好的方法。如果对中间步骤使用物化视图是一种更好的方法,您能告诉我为什么吗?

已经尝试编写这两种方法的脚本,将 15 个中间步骤编写为全局临时表以及物化视图。我发现与临时表相比,MV 的性能略有提高,但代价是物理存储过多。不确定哪个是最佳实践以及为什么

临时表写入磁盘,因此读取和写入都会产生 I/O 成本。此外,大多数站点没有正确管理其临时表,它们最终位于默认的临时表空间上,这与每个人都用于排序等的 TEMP 表空间相同。因此,那里存在资源争用的可能性。

物化视图旨在具体化数据集的各个方面,这些方面通常被许多不同的查询重用。这就是为什么最常见的用例是存储低级别数据的更高级别的聚合。这听起来不像您在此处的用例。瞧!

我正在对 MV 进行完全刷新,而不是增量刷新

所以没有。

然后,我有大约 15 个中间步骤,在这些步骤中,我将组合维度表、执行一些聚合并实现业务逻辑。

这是一种非常程序化的查询数据方式。有时无法避免这种情况,尤其是在某些数据仓库方案中。但是,这并不意味着我们需要具体化这些查询的输出。另一种方法是使用 WITH 子句。一个 WITH 子查询的输出可以馈送到较低的子查询中。

with sq1 as ( 
select whatever
, count(*) as t1_tot
from t1
group by whatever
) , sq2 as (
select sq1.whatever
, max(t2.blah) as max_blah
from sq1
join t2 on t2.whatever = sq1.whatever
) , sq3 as ( 
select sq2.whatever
,(t3.meh + t3.huh) as qty
from sq2
join t3 on t3.whatever = sq2.whatever
where t3.something >= sq2.max_blah
)
select sq1.whatever
,sq1.t1_tot
,sq2.max_blah
,sq3.qty
from sq1
join sq2 on sq2.whatever = sq1.whatever
join sq3 on sq3.whatever = sq1.whatever

不是说这不会是一个可怕的问题,部门的恐怖。但它的性能可能会比你的MViews ot GTT更好。 (Oracle可能会选择具体化这些中间结果集,但我们可以使用提示来影响它。

您甚至可能会发现,通过采用此方法,某些步骤是不必要的,您可以将多个步骤合并到一个查询中。当然,在现实生活中,我会把上面的玩具语句写成一个查询,而不是三个子查询的连接。

从你所说的,我会说使用(全局或私有,取决于你使用的数据库版本)临时表是一个更好的选择。为什么?因为您正在"计算"某些内容,将这些计算的结果存储到某些表中,并重用它们以进行其他处理。所有这些 - 如果没有临时表就无法完成 - 都将通过表完成。

顾名思义,物化视图是一种视图。这是一些查询的结果,但是 - 与"正常"视图相反,它实际上占用空间。可以刷新(按需刷新、源数据更改时刷新或基于计划刷新)。是的,它有它的优势,尽管我看不到您目前正在做的事情。

最新更新