Oracle - 删除维度表中的一行很慢

Posted

技术标签:

【中文标题】Oracle - 删除维度表中的一行很慢【英文标题】:Oracle - Delete One Row in Dimension Table is Slow 【发布时间】:2016-02-06 02:25:54 【问题描述】:

我有一个包含 5 维表和一个事实表的数据集市。 我正在尝试清理一个只有几行(4000 行)的维度表。但是,事实表有数百万行 (25GB)(索引和分区)。

当我尝试删除表格维度中的一行时,该过程变得非常缓慢。尽管与事实表中的行没有关系(级联删除),但它仍然很慢。

有没有办法优化这个?提前致谢。

【问题讨论】:

事实表上是否有引用维度的外键?如果是这样,是否有外键索引?如果是这样,事实表中有多少行引用了维度? 【参考方案1】:

据推测,维度表和事实表之间存在某种级联删除。

在事实表的键列上添加索引可能就足够了。然后 Oracle 可以立即判断任何给定值是否/在哪里。

如果这不起作用,请完全删除外键约束。删除未使用的值并重新添加约束。

【讨论】:

"在事实表的键列上添加索引可能就足够了。然后 Oracle 可以立即判断任何给定值是否/在哪里。"不是选项,因为插入会很慢(新索引)。 “如果这不起作用,请完全删除外键约束。删除未使用的值并重新添加约束。”这是一个很好的选择。只有当我尝试激活约束时它很慢。 @JohnPortella。 . .在列上设置索引确实会减慢插入速度,但我不会将差异描述为“非常慢”,因为存在索引。这是您在具有索引的表上插入的经验吗?没有 hte 索引的相对性能如何?【参考方案2】:

你也可以试试这些策略:

创建事实表的另一个副本,但没有要清理的表的暗外键列。

创建 fact_table_new 为 选择 dim1_k、dim2_k、dim3_k、dim4_k、dim5_k(不是此列)、fact_1、fact_2、... 来自事实表;

更新事实表 设置 dim5_fk_col = null 其中 dim5_fk_col in (select k_col from dim5_table) ;

【讨论】:

新建表不是选项,因为每小时都会插入新信息,而且大小很大。更新事实表很慢。

以上是关于Oracle - 删除维度表中的一行很慢的主要内容,如果未能解决你的问题,请参考以下文章

向维度表中插入行时,oracle 服务器挂起

如何在维度表中查找未使用的行

基于链接到维度表之一的事实表中的键添加新维度

维度建模简介

从维度表设置事实表中的 ID

BIEE04_当维度表中的维不存在事实表中,需要展示所有维度并且数据类展示为0